目前,我的ActionSheet遇到了大麻烦。在iPhone上效果很好,但在iPad上只会崩溃
我只用一个按钮创建一个新项目
import UIKit extension ViewController : UIActionSheetDelegate { func actionSheet(actionSheet: UIActionSheet, didDismissWithButtonIndex buttonIndex: Int) { if actionSheet.tag == 0 { if buttonIndex == 1 { // doing something for "product page" } else if (buttonIndex == 2) { // doing something for "video" } } } } class ViewController: UIViewController, UIActionSheetDelegate { @IBAction func test(sender: AnyObject) { let systemVersion: NSInteger = (UIDevice.currentDevice().systemVersion as NSString).integerValue if systemVersion < 8 { // iOS7: let action:UIActionSheet = UIActionSheet(title: "Change Map Type", delegate: self, cancelButtonTitle: "Back", destructiveButtonTitle: nil, otherButtonTitles: "Product Page", "Video") action.tag = 0 action.showInView(self.view) } else { // iOS8: let alertController: UIAlertController = UIAlertController(title: "Change Map Type", message: nil, preferredStyle: UIAlertControllerStyle.ActionSheet) let cancelAction: UIAlertAction = UIAlertAction(title: "Back", style: UIAlertActionStyle.Cancel, handler: nil) let button1action: UIAlertAction = UIAlertAction(title: "Product Page", style: UIAlertActionStyle.Default, handler: { (action: UIAlertAction!) -> () in // doing something for "product page" }) let button2action: UIAlertAction = UIAlertAction(title: "Video", style: UIAlertActionStyle.Default, handler: { (action: UIAlertAction!) -> () in // doing something for "video" }) alertController.addAction(cancelAction) alertController.addAction(button1action) alertController.addAction(button2action) self.presentViewController(alertController, animated: true, completion: nil) } } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } }
正如我在iPhone上所说的那样,它可以工作,但是如果我单击iPad上的按钮,应用程序将崩溃,
2014-09-25 14:54:52.784 test [9541:1970048] 由于未捕获的异常“ NSGenericException”而终止应用程序,原因:“您的应用程序呈现了UIAlertControllerStyleActionSheet样式的UIAlertController()。 具有此样式的UIAlertController的modalPresentationStyle为UIModalPresentationPopover。您必须通过警报控制器的popoverPresentationController提供此弹出窗口的位置信息。您必须提供sourceView和sourceRect或barButtonItem。如果在显示警报控制器时不知道此信息,则可以在UIPopoverPresentationControllerDelegate方法- prepareForPopoverPresentation中提供它。第一个调用堆栈:(0 CoreFoundation 0x00613df6 exceptionPreprocess + 182 1 libobjc.A.dylib 0x01fdaa97 objc_exception_throw + 44 2的UIKit 0x0164da37 - [UIPopoverPresentationController presentationTransitionWillBegin] + 3086 3的UIKit 0x00f54f75 __71- [UIPresentationController _initViewHierarchyForPresentationSuperview:] _ block_invoke + 1666 4的UIKit 0x00f53554 __56- [UIPresentationController runTransitionForCurrentState] _block_invoke + 226 5的UIKit 0x00f8721b __40 + [UIViewController _scheduleTransition:] _ block_invoke + 18 6 UIKit 0x00e4d62e afterCACommitHandlerblock_invoke + 15 7 UIKit 0x00e4d5d9 _applyBlockToCFArrayCopiedToStack + 415 8 UIKit 0x00e4d3ee _afterCACommitHandler + 545 9的CoreFoundation 0x00536fbe CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 30 10的CoreFoundation 0x00536f00 __CFRunLoopDoObservers + 400 11的CoreFoundation 0x0052c93a __CFRunLoopRun + 1226 12的CoreFoundation 0x0052c1ab CFRunLoopRunSpecific + 443 13的CoreFoundation 0x0052bfdb CFRunLoopRunInMode + 123个14 GraphicsServices 0x0438424f GSEventRunModal + 192个15 GraphicsServices 0x0438408c GSEventRun + 104 16的UIKit 0x00e23e16 UIApplicationMain + 1526 17测试 0x00085e9e top_level_code + 78 18测试 0x00085edb main + 43 19 libdyld.dylib 0x0273eac9开始+ 1 20 ??? 0x00000001 0x0 +1)libc ++ abi.dylib:以类型为NSException的未捕获异常终止
可以在https://www.dropbox.com/s/54jqd8nsc67ll5g/test.zip?dl=0上找到该项目,以供下载并尝试。
错误消息告诉您,您需要给警报控制器popoverPresentationController一个位置,以便它可以正确定位自己。这很容易做- 只需检查是否有一个弹出窗口控制器并将发件人添加为源即可。
popoverPresentationController
如果您的按钮是UIBarButtonItem:
UIBarButtonItem
if let popoverController = alertController.popoverPresentationController { popoverController.barButtonItem = sender } self.presentViewController(alertController, animated: true, completion: nil)
除此以外:
if let popoverController = alertController.popoverPresentationController { popoverController.sourceView = sender popoverController.sourceRect = sender.bounds } self.presentViewController(alertController, animated: true, completion: nil)