在iPad中使用UIAlertController,
樣式設(shè)置成UIAlertControllerStyle.ActionSheet(以下簡稱操作表),運(yùn)行后會出現(xiàn)如下錯誤:


在iPad中,不應(yīng)該直接在視圖上顯示操作表。Apple UI 指南指出,必須在彈出框中顯示操作表。彈出框(popover)是一種獨(dú)特的UI元素,在用戶觸摸某個屏幕元素時出現(xiàn),并通常在用戶觸摸背景時消失。彈出框還包含一個小箭頭,指向出發(fā)它的UI元素。
在iPad中常見操作表時,iOS將自動配置一個彈出框控制器,并將其儲存在提醒控制器的變量屬性popoverPresentationController中。然而,要讓彈出框控制器能夠正常工作,需要設(shè)置其兩個變量屬性:sourceView(觸發(fā)彈出框的視圖)和sourceRect(彈出框應(yīng)指向的矩形區(qū)域)。這兩個屬性指的不是一樣?xùn)|西嗎?是一樣?xùn)|西。Apple文檔甚至指出只要設(shè)置其中的一個。但實(shí)際上,除非設(shè)置著兩個屬性,否則彈出框?qū)⒉荒苷9ぷ鳌?/p>
在presentViewController之前,加入代碼:
if alert.popoverPresentationController != nil {
alert.popoverPresentationController!.sourceView = sender as? UIView
alert.popoverPresentationController!.sourceRect = sender.bounds
}
在非iPad設(shè)備上,popoverPresentationController被設(shè)置為nil,因此不會執(zhí)行這些配置代碼行。在iPad上運(yùn)行,操作表將包含在一個彈出框中;而在iPhone上運(yùn)行時,將像我們預(yù)期的那樣顯示操作表。
在彈出框中顯示操作表時,iOS自動將操作表中的取消按鈕刪除。這是因?yàn)樵谥С謴棾隹虻脑O(shè)備上,取消彈出框的便利方法是觸摸彈出框外面,換句話說,不需要取消按鈕。