14

我正在创建并呈现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 上运行良好,但alertController.popoverPresentationControllerniliPhone 上。

我已经成功地在 iPhone 上使用自适应 segue 样式Present As Popover在界面构建器中呈现弹出框并实现adaptivePresentationStyleForPresentationController委托方法以返回正确UIModalPresentationStyle但我被困在代码中如何做到这一点,UIAlertController因为它popoverPresentationController在 iPhone上没有

4

1 回答 1

8

UIAlertController 并不意味着是一个弹出框。评论中似乎对此存在一些争议。如果实际上尊重.Popover样式,您上面的代码将无法工作。为什么?因为它需要在 popoverPresentationController 对象上有一个sourceView和一个sourceRect集合才能知道箭头指向哪里。如果您将 UIAlertController 换成 UIViewController 它会崩溃,因为这些值没有设置。具有讽刺意味的是,如果您尝试强制解开 popoverPresentationController 它会崩溃:

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

有关如何实现 iPhone 弹出框(除了 UIAlertController 之外的所有内容)的所有详细信息,请查看我的iPhone 弹出框博客文章

popover 表示控制器为 nil 的事实非常说明它不应该是一个 popover。

表视图替代

您可能会考虑将 UITableViewController 作为此处的替代品。在弹出框中使用 Grouped 样式实际上看起来很不错。

选择器

您可能会一遍又一遍地遇到这个问题,您希望用户只从几个选项中进行选择。我建议您将要使用的任何用户界面控件封装到您自己的选择器对象中。可以从调用代码中伪装其是表视图还是仅是一组按钮的实现细节,并且当在特定索引处进行选择时,您可以使用委托或闭包回调。以下是 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 非常简单

于 2016-03-15T05:29:19.300 回答