【问题标题】:Presenting UIAlertController ActionSheet in popover on iPhone在 iPhone 上的弹出窗口中呈现 UIAlertController ActionSheet
【发布时间】:2014-11-10 10:11:51
【问题描述】:

我正在创建并展示一个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

我已经成功地在 iPhone 上使用自适应 segue 样式 Present As Popover 在界面生成器中呈现弹出框,并实现 adaptivePresentationStyleForPresentationController 委托方法以返回正确的 UIModalPresentationStyle 但我不知道如何在代码中使用UIAlertController 执行此操作,因为它在 iPhone 上没有 popoverPresentationController

【问题讨论】:

  • 不是您要找的答案,我可能对此有误,但我认为即使在 iOS 8 中,也无法在 iPhone 的弹出窗口中显示操作表。跨度>
  • 这个链接可以帮到你:) stackoverflow.com/a/25656733/3964913
  • @GordonWorswick 很遗憾没有。根据我的问题,UIAlertController 在 iPhone 上没有popoverPresentationController
  • 下面的链接可能有用;useyourloaf.com/blog/2014/09/05/…
  • popover 在 Iphone 中是不可能的,这是只为 Ipad 实现的功能,如果你仍然想要一个 popover 尝试使用自定义弹出屏幕。

标签: ios iphone popover uialertcontroller


【解决方案1】:

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

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

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

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 非常简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多