23

我为 iPhone 制作了一个应用程序。现在,我正在为 iPad 重新创建它。

当用户选择工具栏中的操作按钮时,弹出框应显示为UIActivityViewController,但由于某种原因,它第一次显示大约需要 10 秒。在 iPhone 上,大约需要一秒钟。除了弹出框外,它是相同的代码。

我尝试禁用弹出框,但仍然需要大约 10 秒才能显示。

这是代码:

-(IBAction)Actions:(UIBarButtonItem*)sender 
{
    if ([activityPopover isPopoverVisible] == YES) 
    {
        [activityPopover dismissPopoverAnimated:YES];
        return;
    }
    UIWebView *currentWebView = ((TabView *)self.tabs[self.currentTabIndex]).webViewObject;

    NSString *currentURL = (NSString*)[currentWebView request].mainDocumentURL;
    if (currentURL == NULL) return;

    BookmarkActivity *bookmarkActivity = [[BookmarkActivity alloc] init];

    UIActivityViewController *sharing = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObject:currentURL] applicationActivities:@[bookmarkActivity]];

    activityPopover = [[UIPopoverController alloc] initWithContentViewController:sharing];
    [activityPopover presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];    
}

我已经在我的 iPad 3 和 iPad mini 上进行了测试,都需要一段时间来展示这一点。

我该如何解决这个问题?

4

4 回答 4

21

好问题,我刚遇到同样的问题。这并不是真正可以解决的。但是,您可以通过创建活动指示器然后将 UIActivityViewController 的初始化发送到后台来改善用户体验:

-(void)openIn:(id)sender
{
    // start activity indicator
    [self.activityIndicator startAnimating];

    // create new dispatch queue in background
    dispatch_queue_t queue = dispatch_queue_create("openActivityIndicatorQueue", NULL);

    // send initialization of UIActivityViewController in background
    dispatch_async(queue, ^{
        NSArray *dataToShare = @[@"MyData"];
        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:dataToShare applicationActivities:nil];

        // when UIActivityViewController is finally initialized, 
        // hide indicator and present it on main thread
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.activityIndicator stopAnimating];
            [self presentViewController:activityViewController animated:YES completion:nil];
        });
    });
}

它就像一个魅力。当用户触摸按钮时,活动指示器开始动画化,从而表明该过程需要一段时间。

于 2013-11-23T16:25:19.137 回答
15

我在 iOS 7 上遇到了同样的问题。但是,当我UIActivityTypeAirDrop从允许的活动类型中删除时,控制器几乎立即出现。

于 2014-03-20T05:29:19.263 回答
5

虽然这些调用已经来自主线程,但从 iOS 7 开始,将其中一些表示调用包装在一个调度块中似乎可以大大减少延迟

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:activityViewController animated:YES completion:nil];
});
于 2015-01-15T16:40:15.027 回答
3

最近自己也有这个问题。有时会需要将近 4 或 5 秒才能弹出,这是一生!不过也只是第一次。随后的电话很快。

几年前也有类似的问题,键盘出现缓慢,有人生成了几行代码添加到预加载键盘的 appdelegate 以解决这个问题。

我在这里使用了类似的方法通过在启动时将它放在 AppDelegate 中来预加载 UIActivityViewController。这绝对是一个不必要的黑客,但我找不到任何其他选择。

let lagfreeAVC:UIActivityViewController = UIActivityViewController(activityItems:  ["start"], applicationActivities: nil)
lagfreeAVC.becomeFirstResponder()
lagfreeAVC.resignFirstResponder()
于 2018-03-27T18:02:25.350 回答