为 UIView 动态创建内容的正确方法是啥?
Posted
技术标签:
【中文标题】为 UIView 动态创建内容的正确方法是啥?【英文标题】:What is the Proper Way to Dynamically Create Content For a UIView?为 UIView 动态创建内容的正确方法是什么? 【发布时间】:2009-09-30 22:23:42 【问题描述】:我有一个包含项目列表的 tableView。当做出选择时,一个新的视图控制器被推送到 tableView 的 navigationController viewController 堆栈上。
我的问题是:视图层次结构中与推送视图控制器关联的视图之一需要先从网络获取数据,然后才能呈现其内容。这种获取是通过 [NSURLRequest requestWithURL: ...] 异步完成的。将数据传递给需要它的视图并让该视图调用它的重载 drawRect 方法的正确方法是什么?目前,我这样做:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
[_connection release];
_connection = nil;
[self performSelectorOnMainThread:@selector(GetDataFromCloudAndCreateView)
withObject:nil
waitUntilDone:NO];
GetDataFromCloudAndCreateView 方法从数据中实例化视图。不幸的是,没有渲染任何内容。我试过 [myView setNeedsDisplay] 但没有效果。
有人可以画出正确的方法吗?谢谢。
【问题讨论】:
你能展示 GetDataFromCloudAndCreateView 方法吗? Valerii,GetDataFromCloudAndCreateView 实例化 UIView 子类的一个实例 - 具有依赖于从云接收的数据的覆盖的 drawRect。我的挑战是如何通知 Cocoa-Touch 我希望这个 UIView 子类呈现自己。尽管 [muView setNeedsDisplay] 目前没有发生这种情况 【参考方案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:
方法根据我传递给它的数据处理它需要的任何实例变量,然后当视图加载时,它将根据这些变量绘制视图。
希望能回答你的问题。
【讨论】:
Cory,我很清楚,上面的代码在你的 tableViewController 中运行对吗?因此,例如在方法 tableView:accessoryButtonTappedForRowWithIndexPath: 中,而不是立即推送 viewController,您将推送 viewController 直到调用 connectionDidFinishLoading: ? 我想我有一个看起来很强大的解决方案。我接受了您在 connectionDidFinishLoading: 中创建视图的想法,但我已经在推送的 viewController 中实现了 connectionDidFinishLoading: 。它是从 viewDidAppear 调用的:它允许完全建立预先存在的视图层次结构。然后,我只需在我调用的方法中添加子视图 - 在主线程上 - 从 connectionDidFinishLoading:这种方法感觉不像我在与 Cocoa 作斗争。感谢您的帮助。以上是关于为 UIView 动态创建内容的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
在 WinForms 中为上下文菜单动态选择菜单项的正确方法是啥?