Iphone 加载时显示子视图,完成时隐藏
我的设置: 在我的iPhone应用程序中,我有一个加载视图(它本身就是一个UIImageView)和加载视图上的两个子视图,一个UIIndicatorView和一个UILabel。要查看它,我调用Iphone 加载时显示子视图,完成时隐藏,iphone,iphone-sdk-3.0,loading,subview,Iphone,Iphone Sdk 3.0,Loading,Subview,我的设置: 在我的iPhone应用程序中,我有一个加载视图(它本身就是一个UIImageView)和加载视图上的两个子视图,一个UIIndicatorView和一个UILabel。要查看它,我调用[self.view addSubview:loadingView]方法,要隐藏它,我使用[loadingView removeFromSuperView] 在我的应用程序中,我使用方法-(void)refreshData。在这个方法中,我显示子视图,下载HTTP POST产生的一些数据,并使用这些数据
[self.view addSubview:loadingView]
方法,要隐藏它,我使用[loadingView removeFromSuperView]
在我的应用程序中,我使用方法-(void)refreshData
。在这个方法中,我显示子视图,下载HTTP POST产生的一些数据,并使用这些数据启动和运行NSXMLParser
当NSXMLParser到达其-(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qName
方法的最后一个元素时,它会隐藏子视图(使用上述方法)
要调用refreshData
方法,我在导航栏中有一个刷新按钮:
self.navigationItem.RightBarButtonim=[[uiBarButtonim alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh目标:自操作:@selector(refreshData)]代码>
我的问题:
单击“刷新”按钮时,子视图不会显示。它调用这些方法,因为在日志中我清楚地看到:
显示加载视图
装载过程中显示的线束(总计15秒)
隐藏加载视图
我也知道我的方法是有效的,因为当我注释掉隐藏视图的方法时,加载视图将继续显示,直到我关闭应用程序
有什么想法吗?如果您在同一个事件回调中隐藏和显示所有内容,那么您还没有给它一个实际更新gui的机会。如果您的工作需要花费大量时间(如15秒),则可以使用NSOperation来执行该操作,并在发生finish回调时隐藏视图
这可能更便于您使用:
要更新gui时,请确保从主线程执行,而不是从NSOperation方法中的事件执行:
可以使用此方法在主线程中运行选择器。
:
要获得更好的答案:
在执行加载的代码中,执行获取数据工作的代码执行以下操作:
// Code to show loading gui
[[[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(refreshData) object:nil] autorelease];
然后,对于刷新数据:
- (void) refreshData {
// do the work
[self performSelectorOnMainThread:@selector(doneRefresing)
withObject:nil waitUntilDone:NO] ;
}
如果您在同一个事件回调中隐藏和显示所有内容,那么您还没有给它一个实际更新gui的机会。如果您的工作需要花费大量时间(如15秒),则可以使用NSOperation来执行该操作,并在发生finish回调时隐藏视图
这可能更便于您使用:
要更新gui时,请确保从主线程执行,而不是从NSOperation方法中的事件执行:
可以使用此方法在主线程中运行选择器。
:
要获得更好的答案:
在执行加载的代码中,执行获取数据工作的代码执行以下操作:
// Code to show loading gui
[[[NSInvocationOperation alloc] initWithTarget:self
selector:@selector(refreshData) object:nil] autorelease];
然后,对于刷新数据:
- (void) refreshData {
// do the work
[self performSelectorOnMainThread:@selector(doneRefresing)
withObject:nil waitUntilDone:NO] ;
}
从文档中:
如果接收器的superview不是
nil,此方法将释放
接受者如果您计划重用
查看,请确保在查看之前保留它
调用此方法并确保
当您需要时,请根据需要释放它
完成或将其添加到
另一个视图层次结构
因此,通过使用“removeFromSuperview”,您实际上是在释放对象并将其从其superview中删除。
从文档中:
如果接收器的superview不是
nil,此方法将释放
接受者如果您计划重用
查看,请确保在查看之前保留它
调用此方法并确保
当您需要时,请根据需要释放它
完成或将其添加到
另一个视图层次结构
因此,通过使用“removeFromSuperview”,您实际上是在释放对象并将其从其superview中移除