0

我的设置:

在我的 iPhone 应用程序中,我有一个加载视图(它本身就是一个 UIImageView)和加载视图上的两个子视图,一个 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)];


我的问题:

当我单击刷新按钮时,子视图不显示。它调用方法是因为在日志中我清楚地看到:

显示加载视图

加载过程中显示的一行行(共 15 秒)

隐藏加载视图

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

有任何想法吗?

4

2 回答 2

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];

然后对于刷新数据:

- (void) refreshData {
   // do the work
   [self performSelectorOnMainThread:@selector(doneRefresing) 
                          withObject:nil waitUntilDone:NO] ;
 }
于 2009-11-24T02:19:49.173 回答
1


从文档:

如果接收者的 superview 不为零,则此方法释放接收者。如果您打算重用视图,请确保在调用此方法之前保留它,并确保在使用完它或将其添加到另一个视图层次结构后适当地释放它。

因此,通过使用“removeFromSuperview”,您实际上是在释放对象并将其从其父视图中删除。

于 2009-12-24T16:01:23.273 回答