UIBarButtonItem with actionSheet style
3 min readFeb 26, 2020
iOS裡面的UIAlertController的preferredStyle有兩種,分別是會顯示在畫面中間的alert,與從畫面下方顯示的actionSheet,但是選擇actionSheet顯示需要特別注意到一點就是,如果app有支援iPad的話,必須要再做處理,不然會crash,因為iPad並不支援從畫面下方顯示😅
下方是iPhone顯示UIAlertController 的actionSheet style
而在iPad的顯示會是popover類型的,就是類似漂浮視窗感覺,那要怎麼處理呢?其實也非常簡單
我的deleteButton是用程式碼產生的
var deleteBtn = UIBarButtonItem(barButtonSystemItem: .trash, target: self, action: #selector(deleteFavorites(sender:)))
再加入到navigationItem,可在viewDidload加入,或者需要時加入
navigationItem.setRightBarButtonItems([barBtn, deleteBtn], animated: true)
建立方法
@objc func deleteFavorites(sender: UIBarButtonItem) {let controller = UIAlertController(title: "", message: "Are you sure you want to delete it?", preferredStyle: .actionSheet)let deleteAction = UIAlertAction(title: "Delete", style: .destructive){ (action) in // TODO}let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)controller.addAction(deleteAction)controller.addAction(cancelAction)
//如果有controller.popoverPresentationController,如果有就將sender物件傳給popController.barButtonItemif let popController = controller.popoverPresentationController {//因為sender是barButtonItem,所以只需要設定這樣即可,如果是一般按鈕需設定sourceRect、sourceView popController.barButtonItem = sender//一般按鈕的設定
popController.sourceRect = sender.bounds popController.sourceView = sender}present(controller, animated: true, completion: nil)}
效果圖: