在iPhone上的popover中呈现UIAlertController ActionSheet

时间:2014-09-16 15:16:28

标签: ios iphone popover uialertcontroller

我按照以下方式创建和展示ActionSheet

let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .ActionSheet)
alertController.modalPresentationStyle = .Popover

// Add some buttons

alertController.popoverPresentationController?.delegate = self
alertController.popoverPresentationController?.barButtonItem = someBarButton

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

这在iPad上运行良好,但iPhone上的alertController.popoverPresentationControllernil

我已经在界面构建器中使用自适应segue样式显示为弹出窗口成功地在iPhone上呈现了弹出窗口,并实现了adaptivePresentationStyleForPresentationController委托方法以返回正确的UIModalPresentationStyle但是我在使用UIAlertController的代码中遇到了怎么做,因为它在iPhone上没有popoverPresentationController

1 个答案:

答案 0 :(得分:7)

UIAlertController并不意味着是一个popover。评论中似乎存在一些争议。如果它实际上尊重.Popover样式,那么上面的代码将不起作用。为什么?因为它需要在popoverPresentationController对象上设置sourceViewsourceRect来知道箭头的指向位置。如果你将UIAlertController交换为UIViewController,它会崩溃,因为这些值没有设置。具有讽刺意味的是,如果您尝试强制打开popoverPresentationController它会崩溃:

alertController.modalPresentationStyle = .Popover
alertController.popoverPresentationController!.sourceView = sender // CRASH!!!
alertController.popoverPresentationController!.sourceRect = sender.bounds

有关如何实现iPhone popover(除了UIAlertController之外的其他所有内容)的所有详细信息,请查看我的iPhone Popover blog post

popover表示控制器为零的事实很明显,它不应该是一个popover。

表格查看替代

您可以将UITableViewController视为此处的替代品。使用Grouped风格实际上在popovers中看起来非常不错。

<强>选取器

您可能会一次又一次地遇到此问题,您希望用户只从几个选项中进行选择。我建议您将您要使用的任何用户界面控件封装到您自己的选择器对象中。是否可以从调用代码伪装其表视图或按钮排列的实现细节,并且当在特定索引处进行选择时,您可以具有委托或闭包回调。这大概是API的样子:

class Picker: UIViewController {
    init(items: [String])
    selectionCompletion: (index: Int, item: String)->Void
}

// Usage:
let picker = Picker(["Answer A","Answer B"])
picker.selectionCompletion = { index, item in
    // handle selection
}

通过这种方式,您可以在任何您喜欢的地方重复使用它,并且API非常简单