我正在使用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被打开。
所有修改用户界面的代码都需要在主队列中运行,这是设计的。所以你需要做的就是:
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
/ init
和setExcludedActivityTypes:
不会更新UI,因此无需在主队列上调用它们。
对于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);
}
试试这个:
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中,它工作正常。
我遇到了同样的问题,我发现我没有在UI线程中调用。尝试在UI线程中运行,看看是否修复了问题