为了账号安全,请及时绑定邮箱和手机立即绑定

UIActivityViewController在iOS 8 iPad上崩溃

UIActivityViewController在iOS 8 iPad上崩溃

Helenr 2019-09-19 09:12:12
我目前正在使用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有什么变化吗?我查了但是我没有找到任何关于此的内容
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

在iPad上,活动视图控制器将使用新的UIPopoverPresentationController显示为弹出窗口,它要求您使用以下三个属性之一为弹出窗口的表示指定锚点:

为了指定锚点,您需要获取对UIActivityController的UIPopoverPresentationController的引用,并设置其中一个属性,如下所示:

if ( [activityViewController respondsToSelector:@selector(popoverPresentationController)] ) { // iOS8
 activityViewController.popoverPresentationController.sourceView =parentView;
 }


查看完整回答
反对 回复 2019-09-19
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

同样的问题来到我的项目然后我找到解决方案,在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 iPhoneif (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
    [self presentViewController:controller animated:YES completion:nil];}//if iPadelse {
    // 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];}

对于swift 4.2 / swift 5

func openShareDilog() {
    let text = "share text will goes here"

    // set up activity view controller
    let textToShare = [text]
    let activityViewController = UIActivityViewController(activityItems: textToShare, applicationActivities: nil)
    activityViewController.excludedActivityTypes = [.airDrop]

    if let popoverController = activityViewController.popoverPresentationController {
        popoverController.sourceRect = CGRect(x: UIScreen.main.bounds.width / 2, y: UIScreen.main.bounds.height / 2, width: 0, height: 0)
        popoverController.sourceView = self.view
        popoverController.permittedArrowDirections = UIPopoverArrowDirection(rawValue: 0)
    }

    self.present(activityViewController, animated: true, completion: nil)}


查看完整回答
反对 回复 2019-09-19
?
四季花海

TA贡献1811条经验 获得超5个赞

我最近在Swift 2.0中遇到了这个确切的问题(原始问题),这UIActivityViewController对于iPhone来说效果很好,但在模拟iPad时会导致崩溃。

我只想在这里添加这个答案的线程,至少在Swift 2.0中,你不需要if语句。你可以popoverPresentationController选择。

快速地说,接受的答案似乎是说你可以只有一个sourceView,只是一个sourceRect,或者只是一个barButtonItem,但根据Apple的UIPopoverPresentationController文档,你需要以下之一:

  • barButtonItem

  • sourceView  sourceRect

我正在研究的特定示例如下所示,我正在创建一个函数,它接受一个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,提到它的两行代码基本上都被忽略了。

有点好,你需要做的就是让它适用于iPad只需要添加两行代码,或者如果你使用的是barButtonItem就可以添加一行代码!


查看完整回答
反对 回复 2019-09-19
  • 3 回答
  • 0 关注
  • 1306 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信