什么是动态创建UIView内容的正确方法?

问题描述:

我有一个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

我过去在这种情况下所做的是在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