UIActivityViewController无法在iOS 11中运行

问题描述 投票:13回答:4

我正在使用UIActivityViewController来共享文章网址,使用下面的代码,

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];

activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 

[self presentViewController:activityVC animated:YES completion:nil];

上面的代码在iOS 9和10中工作,但它在iOS 11中不起作用

我调试它,代码执行正常,之后我在控制台中收到错误日志,如下所示

[ShareSheet]错误:等待建立与ShareUI视图服务扩展的连接超时。

有没有人面临这个问题?有解决方法吗?

编辑:清理并运行项目后,我尝试做同样的事情,在UIActivityViewController打开2或3次后,我再次尝试,第一次我得到相同的上述错误,第二次只有UIActivityViewController被打开。

ios objective-c iphone uiactivityviewcontroller xcode9
4个回答
8
投票

所有修改用户界面的代码都需要在主队列中运行,这是设计的。所以你需要做的就是:

UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];

activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 

dispatch_async(dispatch_get_main_queue(), ^{
    [self presentViewController:activityVC animated:YES completion:nil];
});

更多解释:dispatch_async()将在不久的将来将您传递给它的块排入队列,以便更新UI。如果你不在主队列上这样做,可能会发生奇怪的事情(有时候UI根本不会改变,或者旧的改变可以在新的改变之后应用,或类似的东西)。

从UI中的用户操作发出消息的方法(例如,当您点击按钮时在IBAction中)已经在主队列上运行,因此在那里不需要dispatch_async()(当然,假设您没有从另一个手动调用那些IBAction)队列)。

请注意,alloc / initsetExcludedActivityTypes:不会更新UI,因此无需在主队列上调用它们。


7
投票

对于swift 4.0

let activityViewController: UIActivityViewController = UIActivityViewController(activityItems: [shareItem], applicationActivities:nil)
activityViewController.excludedActivityTypes = [.print, .copyToPasteboard, .assignToContact, .saveToCameraRoll, .airDrop]

DispatchQueue.main.async {
   self.present(activityViewController, animated: true, completion: nil);
}

1
投票

试试这个:

    dispatch_async(dispatch_get_main_queue(), ^{
         UIActivityViewController *activityVC = [[UIActivityViewController alloc] initWithActivityItems:shareItemArray applicationActivities:nil];

         activityVC.excludedActivityTypes = @[UIActivityTypePrint, UIActivityTypeCopyToPasteboard, UIActivityTypeAssignToContact, UIActivityTypeSaveToCameraRoll, UIActivityTypeAirDrop]; 
         dispatch_async(dispatch_get_main_queue(), ^{
               [self presentViewController:activityVC animated:YES completion:nil];
         });
    });

我有同样的问题,但在Swift3中,它工作正常。


0
投票

我遇到了同样的问题,我发现我没有在UI线程中调用。尝试在UI线程中运行,看看是否修复了问题

© www.soinside.com 2019 - 2024. All rights reserved.