Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 加载时显示子视图,完成时隐藏_Iphone_Iphone Sdk 3.0_Loading_Subview - Fatal编程技术网

Iphone 加载时显示子视图,完成时隐藏

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产生的一些数据,并使用这些数据

我的设置:

在我的iPhone应用程序中,我有一个加载视图(它本身就是一个UIImageView)和加载视图上的两个子视图,一个UIIndicatorView和一个UILabel。要查看它,我调用
[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中移除