我的设置:
在我的iPhone应用程序中,我有一个加载View(这是一个UIImageView本身)和加载View,UIIndicatorView和UILabel的两个子视图。要查看它,我调用[self.view addSubview:loadingView]
方法,并使用[loadingView removeFromSuperView]
隐藏它。
在我的应用中刷新我的数据我有方法-(void)refreshData
。在这个方法中,我展示了Subview,下载了一些HTTP POST产生的数据,并使用这些数据启动和NSXMLParser。
当NSXMLParser到达它的-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
方法的最后一个元素时,它会隐藏子视图(使用上面的方法)。
要调用refreshData
方法,我的导航栏中有一个刷新按钮:
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];
我的问题:
单击刷新按钮时,子视图不显示。它调用方法,因为在Log中我清楚地看到:
显示加载视图
加载过程中显示的一串线(总共15秒)
隐藏加载视图
我也知道我的方法有效,因为当我注释掉隐藏视图的方法时,在我关闭应用程序之前会继续看到加载视图
有什么想法吗?
答案 0 :(得分:3)
如果你正在隐藏并在同一个事件回调中显示所有内容,那么你还没有给它实际更新gui的机会。如果你的工作需要很多时间(比如15秒),你可以使用NSOperation来进行操作,并在完成回调时使用,然后隐藏你的视图。
当你想要更新gui时,请确保你从主线程而不是来自NSOperation方法中的事件:
为了更好的答案: 在执行加载的代码中,正在进行工作以获取数据的代码执行:
// Code to show loading gui
[[[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(refreshData) object:nil] autorelease];
然后是refreshData:
- (void) refreshData {
// do the work
[self performSelectorOnMainThread:@selector(doneRefresing)
withObject:nil waitUntilDone:NO] ;
}
答案 1 :(得分:1)
来自文档:
如果接收者的超级视图不是 没有,这种方法释放了 接收器。如果你打算重用 看,一定要保留它 调用此方法并确保 在适当的时候发布它 完成它或添加后 另一个视图层次结构。
因此,通过使用'removeFromSuperview',您实际上是释放对象并将其从超级视图中删除。