ActionSheet无法使用iPad


86

我在应用程序中使用ActionSheet。在我的iPhone上可以运行,但在iPad模拟器上却不能。

这是我的代码:

@IBAction func dialog(sender: AnyObject) {

    let optionMenu = UIAlertController(title: nil, message: "Choose Option", preferredStyle: .ActionSheet)
    let deleteAction = UIAlertAction(title: "Delete", style: .Default, handler: {

        (alert: UIAlertAction!) -> Void in
        println("Filtre Deleted")
    })

    let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        println("Cancelled")
    })

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(cancelAction)

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

我的错误:

由于未捕获的异常“ NSGenericException”而终止应用程序,原因:“您的应用程序呈现了UIAlertControllerStyleActionSheet样式的UIAlertController()。具有此样式的UIAlertController的modalPresentationStyle为UIModalPresentationPopover。您必须通过警报控制器的popoverPresentationController提供此弹出窗口的位置信息。您必须提供sourceView和sourceRect或barButtonItem。如果在显示警报控制器时不知道此信息,则可以在UIPopoverPresentationControllerDelegate方法-prepareForPopoverPresentation中提供它。


链接可能会为您提供帮助。
Nimisha Patel

4
IOS 8.0及以上没有动作片UIActionController实例ü需要设置类型UIAlertControllerStyleActionSheet ....这可能会帮助你....虽然uipopover建议为iPad ....
阿伦

您必须在iPad上以弹出式窗口的形式展示它
Totka

Answers:


110

您需要在提供optionMenu之前提供源代码视图或按钮,因为在iPad上,它提供了UIPopoverPresentationController,正如您在错误中所说的那样。这仅表示您的操作表指向该按钮,让用户知道其从何处开始。

例如,如果要通过单击右侧导航栏项来显示optionMenu。您可以执行以下操作:

optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

self.presentViewController(optionMenu, animated: true, completion: nil)

或者您可以这样设置视图:(您只需要这两个之一)

optionMenu.popoverPresentationController?.sourceView = yourView

self.presentViewController(optionMenu, animated: true, completion: nil)

还请记住,如果将UIAlertControllerStyle更改为Alert而不是Action Sheet,则无需指定此内容。我相信您一定已经弄清楚了,但是我只是想帮助遇到此页面的任何人。


29

对我来说同样的问题。我有一个UIAlertController可以在手机上正常工作,但是在iPad上崩溃了。从表格视图中点击一个单元格时,将弹出该工作表。

对于Swift 3,我在展示它之前添加了3行代码:

        ...

        sheet.popoverPresentationController?.sourceView = self.view
        sheet.popoverPresentationController?.permittedArrowDirections = UIPopoverArrowDirection()
        sheet.popoverPresentationController?.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)


        self.present(sheet, animated: true, completion: nil)

1
这在Swift 5.0中对我有用,但是我不知道如何从视图底部显示弹出窗口。谢谢!
佛罗伦萨·卢帕斯库

@FlorentinLupascu:只需将allowedArrowDirections设置为UIPopoverArrowDirection.Down和sourceRect = CGRect(x:self.view.bounds.midX,y:self.view.bounds.bottom,width:0,height:0)
太高了

24

迅捷3

如前所述,您应该将UIAlertController配置为在iPAD上的特定点上显示。

导航栏示例:

    // 1
    let optionMenu = UIAlertController(title: nil, message: "Choose an option", preferredStyle: .actionSheet)

    // 2
    let deleteAction = UIAlertAction(title: "Option 1", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 1 pressed")
    })
    let saveAction = UIAlertAction(title: "Option 2", style: .default, handler: {
        (alert: UIAlertAction!) -> Void in
        print("option 2 pressed")
    })

    //
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: {
        (alert: UIAlertAction!) -> Void in
        print("Cancelled")
    })


    // 4

    optionMenu.addAction(deleteAction)
    optionMenu.addAction(saveAction)
    optionMenu.addAction(cancelAction)

    // 5

    optionMenu.popoverPresentationController?.barButtonItem = self.navigationItem.rightBarButtonItem

    self.present(optionMenu, animated: true) { 
        print("option menu presented")
    }

7

如果您希望在没有箭头的情况下将其显示在中心[ Swift 3+ ]:

if let popoverController = optionMenu.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []
    }
self.present(optionMenu, animated: true, completion: nil)

4

在呈现之前,请按以下术语添加语句。

optionMenu.popoverPresentationController.sourceView = self.view;
optionMenu.popoverPresentationController.sourceRect = 

CGRectMake(0,0,1.0,1.0);


@IBAction func dialog(sender: AnyObject) {
    ...

    optionMenu.popoverPresentationController.sourceView = self.view;
    optionMenu.popoverPresentationController.sourceRect = CGRectMake(0,0,1.0,1.0);

    self.presentViewController(optionMenu, animated: true, completion: nil)
}

它会很好地工作。


工作完美。唯一的事情是您需要添加“左侧导航栏”项,因此弹出菜单看起来好像从无处不在
Eugene Pavlov

0

请注意,如果您尚未将IB中的sourceview链接到应用程序中的相关变量,也可能会遇到此错误。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.