UIActivityViewController在iOS 8 iPad上崩溃
我目前正在使用Xcode 6(Beta 6)测试我的应用程序。 UIActivityViewController适用于iPhone设备和模拟器,但与iPad模拟器和设备(iOS 8)一起崩溃,并带有以下日志
Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.'
我为iOS 7和iOS 8使用以下iPhone和iPad代码
NSData *myData = [NSData dataWithContentsOfFile:_filename];
NSArray *activityItems = [NSArray arrayWithObjects:myData, nil];
UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:nil applicationActivities:nil];
activityViewController.excludedActivityTypes = @[UIActivityTypeCopyToPasteboard];
[self presentViewController:activityViewController animated:YES completion:nil];
我在其他应用程序中也遇到类似的崩溃。 你能指导我吗? iOS 8中的UIActivityViewController有什么变化? 我检查了但我没有发现任何东西
在iPad上,活动视图控制器将使用新的UIPopoverPresentationController作为弹出窗口显示,它要求您使用以下三个属性之一为弹出窗口的显示指定一个锚点:
为了指定锚点,您将需要获取对UIActivityController的UIPopoverPresentationController的引用,并设置其中一个属性,如下所示:
if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) {
// iOS8
activityViewController.popoverPresentationController.sourceView =
parentView;
}
同样的问题来到我的项目,然后我发现解决方案,打开iPad中的UIActivityViewController我们必须使用UIPopoverController
这里有一个代码可以在iPhone和iPad上使用它们
//to attach the image and text with sharing
UIImage *image=[UIImage imageNamed:@"giraffe.png"];
NSString *str=@"Image form My app";
NSArray *postItems=@[str,image];
UIActivityViewController *controller = [[UIActivityViewController alloc] initWithActivityItems:postItems applicationActivities:nil];
//if iPhone
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
[self presentViewController:controller animated:YES completion:nil];
}
//if iPad
else {
// Change Rect to position Popover
UIPopoverController *popup = [[UIPopoverController alloc] initWithContentViewController:controller];
[popup presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2, self.view.frame.size.height/4, 0, 0)inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
为迅速3
let imageURL: URL = URL(string: product.images[0].fullImageUrlString)!
let objectsToShare: [AnyObject] = [imageURL as AnyObject]
let activityViewController = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)
activityViewController.popoverPresentationController?.sourceView = self.view
activityViewController.excludedActivityTypes = [ UIActivityType.airDrop]
self.present(activityViewController, animated: true, completion: nil)
Swift 2.0中最近遇到了这个确切的问题(原始问题), UIActivityViewController
在iPhones上工作正常,但在模拟iPad时导致崩溃。
我只想在这里添加这个答案的主题,至少在Swift 2.0中,你不需要if语句。 你可以让popoverPresentationController
可选的。
作为一个快速抛开,接受的答案似乎是说你可以只有一个sourceView,只是一个sourceRect,或只是一个barButtonItem,但根据苹果的UIPopoverPresentationController的文档,你需要以下之一:
我正在处理的特定示例如下,其中我创建了一个接收UIView
(用于sourceView和sourceRect)和String
(UIActivityViewController的唯一activityItem)的函数。
func presentActivityViewController(sourceView: UIView, activityItem: String ) {
let activityViewController = UIActivityViewController(activityItems: [activityItem], applicationActivities: [])
activityViewController.popoverPresentationController?.sourceView = sourceView
activityViewController.popoverPresentationController?.sourceRect = sourceView.bounds
self.presentViewController(activityViewController, animated: true, completion: nil)
}
这段代码适用于iPhone和iPad(甚至tvOS我认为) - 如果设备不支持popoverPresentationController
,则提及它的两行代码基本上被忽略。
有点不错,只需添加两行代码即可,只需一行即可使用barButtonItem!
链接地址: http://www.djcxy.com/p/44971.html