在iPad中使用UIAlertController,
样式设置成UIAlertControllerStyle.ActionSheet(以下简称操作表),运行后会出现如下错误:
在iPad中,不应该直接在视图上显示操作表。Apple UI 指南指出,必须在弹出框中显示操作表。弹出框(popover)是一种独特的UI元素,在用户触摸某个屏幕元素时出现,并通常在用户触摸背景时消失。弹出框还包含一个小箭头,指向出发它的UI元素。
在iPad中常见操作表时,iOS将自动配置一个弹出框控制器,并将其储存在提醒控制器的变量属性popoverPresentationController中。然而,要让弹出框控制器能够正常工作,需要设置其两个变量属性:sourceView(触发弹出框的视图)和sourceRect(弹出框应指向的矩形区域)。这两个属性指的不是一样东西吗?是一样东西。Apple文档甚至指出只要设置其中的一个。但实际上,除非设置着两个属性,否则弹出框将不能正常工作。
在presentViewController之前,加入代码:
if alert.popoverPresentationController != nil {
alert.popoverPresentationController!.sourceView = sender as? UIView
alert.popoverPresentationController!.sourceRect = sender.bounds
}
在非iPad设备上,popoverPresentationController被设置为nil,因此不会执行这些配置代码行。在iPad上运行,操作表将包含在一个弹出框中;而在iPhone上运行时,将像我们预期的那样显示操作表。
在弹出框中显示操作表时,iOS自动将操作表中的取消按钮删除。这是因为在支持弹出框的设备上,取消弹出框的便利方法是触摸弹出框外面,换句话说,不需要取消按钮。