UIActivityViewController 使用 sourceView 或 barButtonItem 在 iPad 上崩溃
UIActivityViewController crashing on iPad with sourceView or barButtonItem
我遇到过大多数人试图在 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.
这是我的代码:
- (void)shareLeaflet
{
NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare];
UIActivityViewController *activityViewController = nil;
if (IDIOM == IPAD)
{
NSLog(@"iPad");
activityViewController.popoverPresentationController.sourceView = self.view;
// activityViewController.popoverPresentationController.sourceRect = self.frame;
[self presentViewController:activityViewController
animated:YES
completion:nil];
}
else
{
NSLog(@"iPhone");
activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];
}
在我的 viewDidLoad
中,我有:
UIBarButtonItem *composeButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(shareLeaflet)];
self.navigationItem.rightBarButtonItem = composeButton;
}
此视图是一个 UIPageViewController
,它展示了一些图像,当用户点击分享按钮时,我希望弹出 iOS 8 种风格的分享 sheet。这正是 iPhone 上发生的情况,但在 iPad 上它继续崩溃。这让我想到了 Stack Overflow,但是 none 的问题(crash on showing UIPopOverPresentationController, , UIWebViewTerminating app due to UIPopoverPresentationController, ios8 iPad uiwebview crashes while displaying popover when user taps drop down list HTML select tag 等)对我有用。
我已经尝试了那里的所有解决方案,我完全明白了它的要求。
这就是我想要实现的目标:
对此有任何想法将不胜感激。
您没有在 iPad 上初始化 activityViewController,因此它将始终为 nil。
尝试:
- (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;
[self presentViewController:activityViewController
animated:YES
completion:nil];
}
else
{
NSLog(@"iPhone");
[self presentViewController:activityViewController
animated:YES
completion:nil];
}
然后像图片中那样显示它:(_shareBarButton 是您希望显示弹出窗口的 UIBarButtonItem)
- (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];
}
您可以只为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)
if activityVC.responds(to: #selector(getter: self.popoverPresentationController)) {
activityVC.popoverPresentationController?.barButtonItem = sender
}
self.present(activityVC, animated: true, completion: 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)
我遇到过大多数人试图在 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.
这是我的代码:
- (void)shareLeaflet
{
NSString *forwardedString = [[NSString alloc] initWithFormat:@"Check out this leaflet\n\n %@ \n\nself.theURLToShare];
UIActivityViewController *activityViewController = nil;
if (IDIOM == IPAD)
{
NSLog(@"iPad");
activityViewController.popoverPresentationController.sourceView = self.view;
// activityViewController.popoverPresentationController.sourceRect = self.frame;
[self presentViewController:activityViewController
animated:YES
completion:nil];
}
else
{
NSLog(@"iPhone");
activityViewController = [[UIActivityViewController alloc] initWithActivityItems:[NSArray arrayWithObjects:forwardedString, nil] applicationActivities:nil];
[self presentViewController:activityViewController animated:YES completion:nil];
}
在我的 viewDidLoad
中,我有:
UIBarButtonItem *composeButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:self action:@selector(shareLeaflet)];
self.navigationItem.rightBarButtonItem = composeButton;
}
此视图是一个 UIPageViewController
,它展示了一些图像,当用户点击分享按钮时,我希望弹出 iOS 8 种风格的分享 sheet。这正是 iPhone 上发生的情况,但在 iPad 上它继续崩溃。这让我想到了 Stack Overflow,但是 none 的问题(crash on showing UIPopOverPresentationController,
我已经尝试了那里的所有解决方案,我完全明白了它的要求。
这就是我想要实现的目标:
您没有在 iPad 上初始化 activityViewController,因此它将始终为 nil。
尝试:
- (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;
[self presentViewController:activityViewController
animated:YES
completion:nil];
}
else
{
NSLog(@"iPhone");
[self presentViewController:activityViewController
animated:YES
completion:nil];
}
然后像图片中那样显示它:(_shareBarButton 是您希望显示弹出窗口的 UIBarButtonItem)
- (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];
}
您可以只为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)
if activityVC.responds(to: #selector(getter: self.popoverPresentationController)) {
activityVC.popoverPresentationController?.barButtonItem = sender
}
self.present(activityVC, animated: true, completion: 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)