IOS 8 iPad 应用程序在调用 UIActivityViewController 时崩溃
IOS 8 iPad App Crashes When UIActivityViewController Is Called
当在这个应用的 iPhone 上调用 UIActivityViewController 时,它工作得很好,但是当在 iPad 上调用时,应用程序崩溃了。下面是我使用的代码:
func shareButtonPress() {
//when the share button is pressed, default share phrase is added, cropped image of highscore is added
var sharingItems = [AnyObject]()
var shareButtonHighscore = NSUserDefaults.standardUserDefaults().objectForKey("highscore") as Int!
sharingItems.append("Just hit \(shareButtonHighscore)! Beat it! #Swath")
UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0);
self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
sharingItems.append(image)
let activityViewController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil)
var barButtonItem: UIBarButtonItem! = UIBarButtonItem()
activityViewController.excludedActivityTypes = [UIActivityTypeCopyToPasteboard,UIActivityTypeAirDrop,UIActivityTypeAddToReadingList,UIActivityTypeAssignToContact,UIActivityTypePostToTencentWeibo,UIActivityTypePostToVimeo,UIActivityTypePrint,UIActivityTypeSaveToCameraRoll,UIActivityTypePostToWeibo]
self.presentViewController(activityViewController, animated: true, completion: nil)
}
如您所见,我在 Swift 中,在 SpriteKit 框架中编程,但我不明白应用崩溃的原因。
我收到这个错误:
Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.'
我该怎么做才能解决这个问题?
如果您阅读了错误,它说明了如何修复它,您需要设置 barButtonItem 或 sourceView 来显示弹出窗口,在您的情况下:
func shareButtonPress(pressedButton: UIBarButtonItem) {
...
activityViewController.popoverPresentationController.barButtonItem = pressedButton
self.presentViewController(activityViewController, animated: true, completion: nil)
}
在呈现UIActivityViewController
之前,添加这行代码:
activityViewController.popoverPresentationController?.sourceView = self.view
这样,视图控制器就知道出现在 GameViewController 的哪个帧中。
有两个选项,动作来自 UIBarButtonitem 或 UIView 的 UIButton。
func shareButtonPress() {
...
if let actv = activityViewController.popoverPresentationController {
actv.barButtonItem = someBarButton // if it is a UIBarButtonItem
// Or if it is a view you can get the view rect
actv.sourceView = someView
// actv.sourceRect = someView.frame // you can also specify the CGRect
}
self.presentViewController(activityViewController, animated: true, completion: nil)
}
您可能需要向函数添加发件人,例如 func shareButtonPress(sender: UIBarButtonItem)
或 func shareButtonPress(sender: UIButton)
我添加了 Swift 3:
activityViewController.popoverPresentationController?.sourceView = self.view
解决了我的问题。
Swift 5:
检查设备是 iPhone
还是 iPad
并在此基础上添加 sourceView
并显示 activityController
let activity = UIActivityViewController(activityItems: [self], applicationActivities: nil)
if UIDevice.current.userInterfaceIdiom == .phone {
UIApplication.topViewController?.present(activity, animated: true, completion: nil)
} else {
activity.popoverPresentationController?.sourceView = UIApplication.topViewController!.view
UIApplication.topViewController?.present(activity, animated: true, completion: nil)
}
当在这个应用的 iPhone 上调用 UIActivityViewController 时,它工作得很好,但是当在 iPad 上调用时,应用程序崩溃了。下面是我使用的代码:
func shareButtonPress() {
//when the share button is pressed, default share phrase is added, cropped image of highscore is added
var sharingItems = [AnyObject]()
var shareButtonHighscore = NSUserDefaults.standardUserDefaults().objectForKey("highscore") as Int!
sharingItems.append("Just hit \(shareButtonHighscore)! Beat it! #Swath")
UIGraphicsBeginImageContextWithOptions(UIScreen.mainScreen().bounds.size, false, 0);
self.view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
var image:UIImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
sharingItems.append(image)
let activityViewController = UIActivityViewController(activityItems: sharingItems, applicationActivities: nil)
var barButtonItem: UIBarButtonItem! = UIBarButtonItem()
activityViewController.excludedActivityTypes = [UIActivityTypeCopyToPasteboard,UIActivityTypeAirDrop,UIActivityTypeAddToReadingList,UIActivityTypeAssignToContact,UIActivityTypePostToTencentWeibo,UIActivityTypePostToVimeo,UIActivityTypePrint,UIActivityTypeSaveToCameraRoll,UIActivityTypePostToWeibo]
self.presentViewController(activityViewController, animated: true, completion: nil)
}
如您所见,我在 Swift 中,在 SpriteKit 框架中编程,但我不明白应用崩溃的原因。
我收到这个错误:
Terminating app due to uncaught exception 'NSGenericException', reason: 'UIPopoverPresentationController (<_UIAlertControllerActionSheetRegularPresentationController: 0x7fc7a874bd90>) should have a non-nil sourceView or barButtonItem set before the presentation occurs.'
我该怎么做才能解决这个问题?
如果您阅读了错误,它说明了如何修复它,您需要设置 barButtonItem 或 sourceView 来显示弹出窗口,在您的情况下:
func shareButtonPress(pressedButton: UIBarButtonItem) {
...
activityViewController.popoverPresentationController.barButtonItem = pressedButton
self.presentViewController(activityViewController, animated: true, completion: nil)
}
在呈现UIActivityViewController
之前,添加这行代码:
activityViewController.popoverPresentationController?.sourceView = self.view
这样,视图控制器就知道出现在 GameViewController 的哪个帧中。
有两个选项,动作来自 UIBarButtonitem 或 UIView 的 UIButton。
func shareButtonPress() {
...
if let actv = activityViewController.popoverPresentationController {
actv.barButtonItem = someBarButton // if it is a UIBarButtonItem
// Or if it is a view you can get the view rect
actv.sourceView = someView
// actv.sourceRect = someView.frame // you can also specify the CGRect
}
self.presentViewController(activityViewController, animated: true, completion: nil)
}
您可能需要向函数添加发件人,例如 func shareButtonPress(sender: UIBarButtonItem)
或 func shareButtonPress(sender: UIButton)
我添加了 Swift 3:
activityViewController.popoverPresentationController?.sourceView = self.view
解决了我的问题。
Swift 5:
检查设备是 iPhone
还是 iPad
并在此基础上添加 sourceView
并显示 activityController
let activity = UIActivityViewController(activityItems: [self], applicationActivities: nil)
if UIDevice.current.userInterfaceIdiom == .phone {
UIApplication.topViewController?.present(activity, animated: true, completion: nil)
} else {
activity.popoverPresentationController?.sourceView = UIApplication.topViewController!.view
UIApplication.topViewController?.present(activity, animated: true, completion: nil)
}