2010-09-13 181 views
0

這是我的第一個iPhone應用程序,我使用JSON框架來解碼從服務器發送的JSON。在兩個類之間共享數據

我將數據從AppDelegate文件插入到NSMutableArray中。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    responseData = [[NSMutableData data] retain]; 
    museums = [[NSMutableArray alloc] init]; 
    viewController = [[RootViewController alloc] init]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://my_json_link"]]; 
    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    [window addSubview:navigationController.view]; 
    [window makeKeyAndVisible]; 

    return YES; 
} 


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { 
    [responseData setLength:0]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
    [responseData appendData:data]; 
} 

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { 
    NSLog(@"Connection failed: %@", [error description]); 
} 


- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 
    [connection release]; 

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 
    [responseData release]; 

    NSError *error; 
    SBJSON *json = [[SBJSON new] autorelease]; 
    NSDictionary *data = (NSDictionary *)[json objectWithString:responseString error:&error]; 
    [responseString release]; 

    if (data == nil) 
     NSLog(@"JSON parsing failed: %@", [error localizedDescription]); 
    else { 
     for (NSDictionary *item in data) { 

      // Read the data 
      NSString *aName = [item objectForKey:@"name"]; 
      NSString *aDescription = [item objectForKey:@"description"]; 

      // Create a new museum object with the data from json 
      Museum *museum = [[Museum alloc] initWithName:aName description:aDescription]; 

      // Add the museum object to the Array 
      [museums addObject:museum]; 
      [museum release]; 
     }  
    } 
    viewController.museums = museums; 
} 

的博物館數組不connectionDidFinishLoading功能裏面空的,但我不能看到它時,我嘗試打印在RootViewController的。 我試圖設置陣列中的行

viewController.museums = museums; 

,但我不明白什麼是錯的。從第一功能connectionDidFinishLoading功能

[window addSubview:viewController.view]; 
[window makeKeyAndVisible]; 

我可以解決這個問題只有當我移動這些線。但是在這種情況下,當我單擊表格的一個記錄時,其他視圖不起作用。

感謝您的任何幫助。

+0

我已編輯您的文章標題以反映實際問題。隨意回滾,如果你認爲這是不恰當的:) – willcodejavaforfood 2010-09-13 17:15:20

+0

而且我已經更新了我的答案,解決了我認爲你的問題是:) – willcodejavaforfood 2010-09-13 17:19:48

回答

1
viewController = [[RootViewController alloc] init]; 

首先,我需要你確保你在didFinishLaunching...創建viewController實際上是正確的viewController。你真的把那個實例連接成你認爲的那樣嗎?還是你兩個實例操作系統是RootViewController

其次,如果您實際設置的是RootViewController的正確實例上的博物館,則需要確保您的時間安排正確。這意味着,你要爲museums之前,你想打印出來的viewController

- 編輯 -

OK,因爲我們建立的東西都是在錯誤的順序,你應該嘗試並重新加載表發生。 UITableView有一個名爲reloadData的方法,將爲您處理此問題,並且您需要在創建表後每次更改數據源時調用此方法。

所以在RootViewController的添加一個方法叫做重載這反過來對你的UITableView電話reloadData和修改代碼:

viewController.museums = museums; 
[viewController reload]; 
+0

感謝您的重播。你是對的,如果我調試代碼RootViewController在委託之前被調用,這就是爲什麼我不能在表中看到任何東西。對不起,但我是新的iPhone應用程序,我不知道如何連線兩個實例。我需要在MainWindow.xib中完成嗎? – Katie 2010-09-13 14:43:01

+0

所以它發生在錯誤的順序? viewController是否有一個應該顯示數據的表? – willcodejavaforfood 2010-09-13 17:11:01

-1

嘗試使用

viewController.museums = [museums retain]; 
+0

是的,我有同樣的問題 – Katie 2010-09-13 11:50:37

+1

不需要(將創建內存泄漏)if你的viewController的'博物館'被宣佈爲'保留'屬性,這是它被宣佈的正常方式。 – 2010-09-13 13:51:18

+0

不一定。當你使用保留,你必須釋放,並且不會有任何漏洞。 – Satyam 2010-09-14 09:23:23

0

嘗試將NSLog的內部for循環,如果執行的時候檢查。

1

你可以添加到您的視圖控制器,暫時只進行調試:

-(void) setMuseums:(NSMutableArray*)m { 
    self->_museums = [m retain]; 
} 

然後在那裏添加一個斷點。確保它正在被擊中,或者稍後有些事情會發生,並將其設置爲零。

博物館物業被宣佈爲@property(nonatomic,retain)NSMutableArray *博物館;對?

+0

謝謝。是的,該物業是(非原子,保留)。現在我試圖插入setMuseums,我可以看到博物館數組已設置,但在numberOfRowsInSection函數之後。所以有什麼不對,但我不明白在哪裏。 – Katie 2010-09-13 15:06:56

+0

太棒了!然後,您可能只需在設置博物館資產後重新加載其數據。設置博物館後,請執行[viewController.tableView reloadData] – 2010-09-13 17:38:52