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有什么变化吗?我查了但是我没有找到任何关于此的内容


Helenr
浏览 1309回答 3
3回答

九州编程

在iPad上,活动视图控制器将使用新的UIPopoverPresentationController显示为弹出窗口,它要求您使用以下三个属性之一为弹出窗口的表示指定锚点:barButtonItemsourceViewsourceRect为了指定锚点,您需要获取对UIActivityController的UIPopoverPresentationController的引用,并设置其中一个属性,如下所示:if&nbsp;(&nbsp;[activityViewController&nbsp;respondsToSelector:@selector(popoverPresentationController)]&nbsp;)&nbsp;{&nbsp;//&nbsp;iOS8 &nbsp;activityViewController.popoverPresentationController.sourceView&nbsp;=parentView; &nbsp;}

一只斗牛犬

同样的问题来到我的项目然后我找到解决方案,在iPad中打开UIActivityViewController,我们必须使用UIPopoverController这是一个在iPhone和iPad上使用它的代码//to&nbsp;attach&nbsp;the&nbsp;image&nbsp;and&nbsp;text&nbsp;with&nbsp;sharing&nbsp;UIImage&nbsp;*image=[UIImage&nbsp;imageNamed:@"giraffe.png"];NSString&nbsp;*str=@"Image&nbsp;form&nbsp;My&nbsp;app";NSArray&nbsp;*postItems=@[str,image];UIActivityViewController&nbsp;*controller&nbsp;=&nbsp;[[UIActivityViewController&nbsp;alloc]&nbsp;initWithActivityItems:postItems&nbsp;applicationActivities:nil];//if&nbsp;iPhoneif&nbsp;(UI_USER_INTERFACE_IDIOM()&nbsp;==&nbsp;UIUserInterfaceIdiomPhone)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;[self&nbsp;presentViewController:controller&nbsp;animated:YES&nbsp;completion:nil];}//if&nbsp;iPadelse&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Change&nbsp;Rect&nbsp;to&nbsp;position&nbsp;Popover &nbsp;&nbsp;&nbsp;&nbsp;UIPopoverController&nbsp;*popup&nbsp;=&nbsp;[[UIPopoverController&nbsp;alloc]&nbsp;initWithContentViewController:controller]; &nbsp;&nbsp;&nbsp;&nbsp;[popup&nbsp;presentPopoverFromRect:CGRectMake(self.view.frame.size.width/2,&nbsp;self.view.frame.size.height/4,&nbsp;0,&nbsp;0)inView:self.view&nbsp;permittedArrowDirections:UIPopoverArrowDirectionAny&nbsp;animated:YES];}对于swift 4.2 / swift 5func&nbsp;openShareDilog()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;text&nbsp;=&nbsp;"share&nbsp;text&nbsp;will&nbsp;goes&nbsp;here" &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;set&nbsp;up&nbsp;activity&nbsp;view&nbsp;controller &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;textToShare&nbsp;=&nbsp;[text] &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;activityViewController&nbsp;=&nbsp;UIActivityViewController(activityItems:&nbsp;textToShare,&nbsp;applicationActivities:&nbsp;nil) &nbsp;&nbsp;&nbsp;&nbsp;activityViewController.excludedActivityTypes&nbsp;=&nbsp;[.airDrop] &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;let&nbsp;popoverController&nbsp;=&nbsp;activityViewController.popoverPresentationController&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;popoverController.sourceRect&nbsp;=&nbsp;CGRect(x:&nbsp;UIScreen.main.bounds.width&nbsp;/&nbsp;2,&nbsp;y:&nbsp;UIScreen.main.bounds.height&nbsp;/&nbsp;2,&nbsp;width:&nbsp;0,&nbsp;height:&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;popoverController.sourceView&nbsp;=&nbsp;self.view &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;popoverController.permittedArrowDirections&nbsp;=&nbsp;UIPopoverArrowDirection(rawValue:&nbsp;0) &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;self.present(activityViewController,&nbsp;animated:&nbsp;true,&nbsp;completion:&nbsp;nil)}

四季花海

我最近在Swift 2.0中遇到了这个确切的问题(原始问题),这UIActivityViewController对于iPhone来说效果很好,但在模拟iPad时会导致崩溃。我只想在这里添加这个答案的线程,至少在Swift 2.0中,你不需要if语句。你可以popoverPresentationController选择。快速地说,接受的答案似乎是说你可以只有一个sourceView,只是一个sourceRect,或者只是一个barButtonItem,但根据Apple的UIPopoverPresentationController文档,你需要以下之一:barButtonItemsourceView&nbsp;和&nbsp;sourceRect我正在研究的特定示例如下所示,我正在创建一个函数,它接受一个UIView(对于sourceView和sourceRect)和String(UIActivityViewController唯一的activityItem)。func&nbsp;presentActivityViewController(sourceView:&nbsp;UIView,&nbsp;activityItem:&nbsp;String&nbsp;)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;let&nbsp;activityViewController&nbsp;=&nbsp;UIActivityViewController(activityItems:&nbsp;[activityItem],&nbsp;applicationActivities:&nbsp;[]) &nbsp;&nbsp;&nbsp;&nbsp;activityViewController.popoverPresentationController?.sourceView&nbsp;=&nbsp;sourceView &nbsp;&nbsp;&nbsp;&nbsp;activityViewController.popoverPresentationController?.sourceRect&nbsp;=&nbsp;sourceView.bounds &nbsp;&nbsp;&nbsp;&nbsp;self.presentViewController(activityViewController,&nbsp;animated:&nbsp;true,&nbsp;completion:&nbsp;nil)}这段代码适用于iPhone和iPad(我认为甚至是tvOS) - 如果设备不支持popoverPresentationController,提到它的两行代码基本上都被忽略了。有点好,你需要做的就是让它适用于iPad只需要添加两行代码,或者如果你使用的是barButtonItem就可以添加一行代码!
打开App,查看更多内容
随时随地看视频慕课网APP