关闭 UIPopoverController 的最快方法是啥?

Posted

技术标签:

【中文标题】关闭 UIPopoverController 的最快方法是啥?【英文标题】:Fastest way to dismiss a UIPopoverController?关闭 UIPopoverController 的最快方法是什么? 【发布时间】:2012-09-12 16:57:56 【问题描述】:

我将来自 UIPopoverController 的通知发布回我的主视图,然后立即调用dismissPopoverAnimated,然后开始执行一些相当繁重的工作来加载 Web 视图。所有这些代码都有效;问题在于,在一些较旧的 ipad 上,直到 CPU 密集型工作完成(在调试器中验证)之后,popover 才会真正解除。这会导致弹出框在被解雇后似乎挂起一秒钟。如何确保立即关闭弹出框而不是先执行密集代码?

响应通知的方法如下:

- (void)changeDefaultView:(NSNotification *)note

    [self closePopover];

    int i;
    for(i = 0; i < [arrWebViewControllers count]; i++)
    
        WebViewController *wvc = [arrWebViewControllers objectAtIndex:i];
        [[wvc webview] stopLoading];
        [[wvc webview] removeFromSuperview];
        [[wvc imageview] removeFromSuperview];
        wvc = nil;
    

    [arrWebViewControllers removeAllObjects];
    [arrLinks removeAllObjects];
    [arrImageViews removeAllObjects];

    [self loadCategory:[note object]];

    [self addWidgetsToView];

而closePopover是:

- (void)closePopover

    if(popover != nil)
    
        [popover dismissPopoverAnimated:YES];
        popover = nil;
    

【问题讨论】:

【参考方案1】:

popover 消失的动画发生在主运行循环上;如果你在主线程上做繁重的 CPU 工作,那么循环将没有机会运行。所以你需要做的是在后台线程上执行你的工作。

目前首选的方法是使用 Grand Central Dispatch,如下所示:(我假设 loadCategory: 是 CPU 密集型操作)

- (void)changeDefaultView:(NSNotification *)note

    [self closePopover];

    int i;
    for(i = 0; i < [arrWebViewControllers count]; i++)
    
        WebViewController *wvc = [arrWebViewControllers objectAtIndex:i];
        [[wvc webview] stopLoading];
        [[wvc webview] removeFromSuperview];
        [[wvc imageview] removeFromSuperview];
        wvc = nil;
    

    [arrWebViewControllers removeAllObjects];
    [arrLinks removeAllObjects];
    [arrImageViews removeAllObjects];

    // perform the expensive operation on a background thread
    dispatch_async(dispatch_get_global_queue(0, 0), ^

        [self loadCategory:[note object]];

        // now get back onto the main thread to perform our UI update
        dispatch_async(dispatch_get_main_queue(), ^

            [self addWidgetsToView];

        );

    );

【讨论】:

谢谢,这应该会有很大帮助 - 我也可以将 addWidgets 放在块中,我会尽快使用它。 假设 addWidgetsToView 将任何内容添加到您的视图中,您需要将其放在主队列中。 是的 - 我试过了,但它崩溃了,但亲眼目睹这仍然是一个很好的教训。您的代码的唯一变化是我还将 for 循环/删除对象放入后台线程,现在它工作得很好。再次感谢!

以上是关于关闭 UIPopoverController 的最快方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

关闭 UIPopoverController 的最快方法是啥?

如何在 UIPopoverController 上创建按钮 [关闭]

ipad - 关闭 UIPopoverController

关闭 UIPopoverController 不会卸载 contentController

可以在拖动操作上关闭 UIPopoverController

UIPopoverController 在 iOS 8 / Xcode 6 中没有关闭