首页 文章

Swift UIAlertController - > ActionSheet iPad iOS8崩溃

提问于
浏览
50

目前我的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 ___afterCACommitHandler_block_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 test 0x00085e9e top_level_code 78 18 test 0x00085edb main 43 19 libdyld.dylib 0x0273eac9 start 1 20 ??? 0x00000001 0x0 1)libc abi.dylib:以NSException类型的未捕获异常终止

项目可以在https://www.dropbox.com/s/54jqd8nsc67ll5g/test.zip?dl=0找到下载并试用 .

4 回答

  • 1

    错误消息告诉您需要为警报控制器的 popoverPresentationController 提供一个位置,以便它可以正确定位 . 这很容易做 - 只需检查是否有弹出控制器并添加发件人作为源 .

    如果您的按钮是 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)
    
  • 7

    试试这个

    alertController.popoverPresentationController?.sourceView = self.view
    
  • 2

    Nate Cook是完全正确但我会这样做所以我发现它是iPad还是iPhone .

    这是 barButtonItem

    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad ){
    
                if let currentPopoverpresentioncontroller = alertController.popoverPresentationController{
                    currentPopoverpresentioncontroller.barButtonItem = sender as! UIBarButtonItem
                    currentPopoverpresentioncontroller.permittedArrowDirections = UIPopoverArrowDirection.down;
                    self.present(alertController, animated: true, completion: nil)
                }
            }else{
                self.present(alertController, animated: true, completion: nil)
            }
    
  • 138

    var actionSheet = UIAlertController( Headers :“请选择相机或照片库”,消息:“”,preferredStyle:.actionSheet)

    if ( UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad ){
            actionSheet = UIAlertController(title: "Please Select Camera or Photo Library", message: "", preferredStyle: .alert)
        }
    
        actionSheet.addAction(UIAlertAction(title: "Upload a Photo", style: .default, handler: { (UIAlertAction) in
            self.openPhotoLibrary()
        }))
        actionSheet.addAction(UIAlertAction(title: "Take a Photo", style: .default, handler: { (UIAlertAction) in
            self.openCamera()
        }))
        actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
        self.present(actionSheet, animated: true, completion: nil)
    

相关问题