代码之家  ›  专栏  ›  技术社区  ›  conradev

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

  •  0
  • conradev  · 技术社区  · 16 年前

    我的设置:

    在我的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.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshData)];


    我的问题:

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

    显示加载视图

    加载过程中显示的一束线(总共15秒)

    隐藏加载视图

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

    有什么想法吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Eld    16 年前

    如果您在同一个事件回调中隐藏和显示所有内容,那么您还没有给它机会实际更新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] ;
     }
    
        2
  •  1
  •   imnk    16 年前


    来自文档:

    如果接收器的SuperView不是 无,此方法释放 接收器。如果您计划重用 视图,请务必在 调用此方法并确保 如果你是 完成或添加到 另一个视图层次结构。

    因此,通过使用“removeFromSuperView”,您实际上是在释放对象,并将其从其SuperView中移除。