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

时间:2009-11-24 01:40:11

标签: iphone iphone-sdk-3.0 loading subview

我的设置:

在我的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秒)

隐藏加载视图

我也知道我的方法有效,因为当我注释掉隐藏视图的方法时,在我关闭应用程序之前会继续看到加载视图

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果你正在隐藏并在同一个事件回调中显示所有内容,那么你还没有给它实际更新gui的机会。如果你的工作需要很多时间(比如15秒),你可以使用NSOperation来进行操作,并在完成回调时使用,然后隐藏你的视图。

http://developer.apple.com/iphone/library/documentation/cocoa/Reference/NSOperation_class/Reference/Reference.html

这可能更容易使用: http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/NSInvocationOperation_Class/Reference/Reference.html#//apple_ref/occ/cl/NSInvocationOperation

当你想要更新gui时,请确保你从主线程而不是来自NSOperation方法中的事件:

您可以使用此方法在主线程中运行选择器。 http://developer.apple.com/iphone/library/documentation/cocoa/Reference/Foundation/Classes/NSObject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/performSelectorOnMainThread:withObject:waitUntilDone

为了更好的答案: 在执行加载的代码中,正在进行工作以获取数据的代码执行:

// 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',您实际上是释放对象并将其从超级视图中删除。