2009-09-30 133 views
0

我有一個tableView與項目列表。當進行選擇時,將在tableView的navigationController viewController堆棧上推送新的視圖控制器。什麼是動態創建UIView內容的正確方法?

我的問題是這樣的:與推送視圖控制器關聯的視圖層次結構中的一個視圖需要從網絡中獲取數據,然後才能呈現其內容。這個提取是通過[NSURLRequest requestWithURL:...]異步完成的。將數據傳遞給需要它的視圖的正確方法是什麼,並且該視圖稱它爲重載的drawRect方法?目前,我這樣做:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection { 


    [_connection release]; 
    _connection = nil; 

    [self performSelectorOnMainThread:@selector(GetDataFromCloudAndCreateView) 
         withObject:nil 
        waitUntilDone:NO]; 


} 

方法GetDataFromCloudAndCreateView實例化視圖形式的數據。不幸的是,沒有任何東西被渲染我嘗試過[myView setNeedsDisplay],但它沒有效果。

有人可以勾畫正確的方法來做到這一點?謝謝。

+0

你可以顯示GetDataFromCloudAndCreateView方法嗎? – 2009-10-01 07:57:49

+0

Valerii, GetDataFromCloudAndCreateView實例化一個UIView子類的實例 - 重寫drawRect,這取決於從雲端接收到的數據。我的挑戰是如何通知Cocoa-Touch我希望這個UIView子類呈現它自己。儘管[muView setNeedsDisplay] – dugla 2009-10-01 11:18:14

回答

1

我過去在這種情況下所做的是在connectionDidFinishLoading:方法中創建新的UIViewController,然後將其推入。像這樣:

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

    // Code to stop a loading indicator of some kind 

    UIViewController *newView = [[SomeViewController alloc] initWithData:fetchedData]; 
    [self.navigationController pushViewController:newView animated:YES]; 
} 

新控制器上的initWithData:方法需要任何實例變量的照顧它需要根據我傳遞給它,然後在視圖加載它將利用基於這些變量視圖中的數據。

希望能回答你的問題。

+0

Cory, 儘管如此,我很清楚,上面的代碼在你的tableViewController中運行正確嗎?所以例如在方法tableView:accessoryButtonTappedForRowWithIndexPath中:而不是立即推送viewController你推遲viewController的推動,直到connectionDidFinishLoading:被調用? – dugla 2009-10-01 00:14:53

+0

我想我有一個看起來很健壯的解決方案。我想到了在connectionDidFinishLoading中創建視圖的想法:但是我在推送的viewController中實現了connectionDidFinishLoading:。它從viewDidAppear中調用:它允許預先存在的視圖層次結構完全建立。然後,我簡單地在我從主要線程調用的方法中添加子視圖 - 來自connectionDidFinishLoading:這種方法感覺不像我正在與可可一樣。感謝您的幫助。 – dugla 2009-10-01 16:26:22

相關問題