Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIActivityViewController在带有sourceView或barButtonItem的iPad上崩溃_Ios_Objective C_Ipad_Uiwebview_Uiactivityviewcontroller - Fatal编程技术网

Ios UIActivityViewController在带有sourceView或barButtonItem的iPad上崩溃

Ios UIActivityViewController在带有sourceView或barButtonItem的iPad上崩溃,ios,objective-c,ipad,uiwebview,uiactivityviewcontroller,Ios,Objective C,Ipad,Uiwebview,Uiactivityviewcontroller,我遇到了大多数人在iPad上展示UIActivityViewController时所面临的情况;它正在与以下内容碰撞: Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc4f2d87d00>)

我遇到了大多数人在iPad上展示
UIActivityViewController
时所面临的情况;它正在与以下内容碰撞:

Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc4f2d87d00>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.
在我的
viewDidLoad
中,我有:

UIBarButtonItem *composeButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self                                    action:@selector(shareLeaflet)];

    self.navigationItem.rightBarButtonItem = composeButton;
}
此视图是一个
UIPageViewController
,它显示一些图像,当用户点击共享按钮时,我期待着iOS 8样式的共享表弹出。这正是iPhone上发生的事情,但在iPad上,它继续崩溃。这导致了堆栈溢出,但没有一个问题(、等)适合我

我已经尝试了所有的解决方案,我只是完全得到了它所需要的

这就是我想要实现的目标:


如果您对此有任何想法,我们将不胜感激

您没有在iPad上初始化activityViewController,因此它将始终为零

尝试:

然后在图像中显示它:(_shareBarButton是您希望popover从中显示的UIBarButtonim)


您只需为iPad设置
popoverPresentationController
barButtonItem
,例如:

let activityViewController = UIActivityViewController(activityItems: ["Hello, world!", urlString], applicationActivities: nil)

if UIDevice.current.userInterfaceIdiom == .pad {
    activityViewController.popoverPresentationController?.barButtonItem = barButtonItem
}

self.present(activityViewController, animated: true)

好吧,我通过简单地检查选择器来修复iPad上的崩溃: 让activityVC=UIActivityViewController(activityItems:objectsToShare,applicationActivities:nil)


iPad和iPhone iOS 14.4的最佳解决方案

let urlstring = "https://apps.apple.com/ae/app/"
let text = "some text for your app"
let url = NSURL(string: urlstring)
let textToShare = [url!,text] as [Any]
let activityViewController = UIActivityViewController(activityItems: textToShare as [Any], applicationActivities: nil)
    
activityViewController.excludedActivityTypes = [ UIActivity.ActivityType.airDrop, UIActivity.ActivityType.postToFacebook ,UIActivity.ActivityType.postToFlickr,UIActivity.ActivityType.postToTwitter,UIActivity.ActivityType.postToVimeo,UIActivity.ActivityType.mail,UIActivity.ActivityType.addToReadingList]

activityViewController.popoverPresentationController?.sourceView = self.view
activityViewController.popoverPresentationController?.sourceRect = view.bounds
activityViewController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.down
UIApplication.shared.windows.first?.rootViewController?.present(activityViewController, animated: true, completion: nil)

嗨@JDx-啊,伙计,这很简单!对不起,这里的问题很简单,这很有魅力!非常感谢。但我想问一个后续问题——我能控制弹出窗口来自哪一侧吗?现在,它来自屏幕的左上角,但按钮实际上在右上角。没问题!我不认为你可以,也许你可以用UiPopoverController来代替?谢谢JD-我只是想激活UIActivityViewController,就像iOS 8/9共享表一样。我刚刚更新了这个问题,将Safari的一张图片放在iPad上——它就在那个按钮的正下方,但我的图片出现在左边,这很奇怪。我想你必须在UIPopoverController中显示activityViewController。我已经用一些代码更新了我的答案。这很有魅力!非常感谢您在这个JDx上的帮助-非常感谢
- (void)shareLeaflet
    {
        NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare];
        UIActivityViewController *activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil];

        if (IDIOM == IPAD)
        {
            NSLog(@"iPad");
            activityViewController.popoverPresentationController.sourceView = self.view;
    //        activityViewController.popoverPresentationController.sourceRect = self.frame;

           _popover = [[UIPopoverController alloc] initWithContentViewController:activityViewController];
           _popover.delegate = self;
           [_popover presentPopoverFromBarButtonItem:_shareBarButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        }
        else
        {
            NSLog(@"iPhone");
            [self presentViewController:activityViewController 
                              animated:YES 
                            completion:nil];
        }
let activityViewController = UIActivityViewController(activityItems: ["Hello, world!", urlString], applicationActivities: nil)

if UIDevice.current.userInterfaceIdiom == .pad {
    activityViewController.popoverPresentationController?.barButtonItem = barButtonItem
}

self.present(activityViewController, animated: true)
        if activityVC.responds(to: #selector(getter: self.popoverPresentationController)) {
            activityVC.popoverPresentationController?.barButtonItem = sender
        }
        self.present(activityVC, animated: true, completion: nil)
let urlstring = "https://apps.apple.com/ae/app/"
let text = "some text for your app"
let url = NSURL(string: urlstring)
let textToShare = [url!,text] as [Any]
let activityViewController = UIActivityViewController(activityItems: textToShare as [Any], applicationActivities: nil)
    
activityViewController.excludedActivityTypes = [ UIActivity.ActivityType.airDrop, UIActivity.ActivityType.postToFacebook ,UIActivity.ActivityType.postToFlickr,UIActivity.ActivityType.postToTwitter,UIActivity.ActivityType.postToVimeo,UIActivity.ActivityType.mail,UIActivity.ActivityType.addToReadingList]

activityViewController.popoverPresentationController?.sourceView = self.view
activityViewController.popoverPresentationController?.sourceRect = view.bounds
activityViewController.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection.down
UIApplication.shared.windows.first?.rootViewController?.present(activityViewController, animated: true, completion: nil)