[APP開發-使用Swift] 8. UIAlertController 與Table View互動
在前一篇文章7. UITableView Custom Cell 我們完成了可以顯示我們喜愛餐廳的表格,接下來我們希望點選某一間餐廳,可以讓我們打電話給餐廳訂位,或者將喜愛的餐廳標示符號。
在觀念介紹:Delegation中我們提過,針對表格的事件處理可以找UITableViewDelegate這位專家,發現didSelectRowAt indexPath應該很適合處理點選餐廳後的動作。在Xcode只要輸入selectrow就會帶出相關的function作挑選,找到didSelectRowAt按Enter即可。
為了可以同時滿足在點選某一間餐廳之後,可以選擇打電話給餐廳,或者標示符號,我們將使用Swift裡的提示訊息UIAlertController。先觀看結果如下:
接下來針對上圖的各步驟做說明:
- 新增一個Alert選單
let optionMenu = UIAlertController(title: nil, message: "請選擇", preferredStyle: .actionSheet)
我們在觀念介紹:Class、Object中提過,利用Class、Object觀念我們可以很容易複製我們需要的功能,參考以下Apple文件說明,Apple已經提供了UIAlertController這個Class讓我們方便使用,所以我們宣告optionMenu作為UIAlertController的Object,利用init初始化的功能,很快就完成了一個Alert選單。
2. 加上打電話動作
同樣地,利用UIAlertAction現成的Class,我們宣告一個callAction可以按下去以後打電話到餐廳的功能,因為這功能須作實機測試,我們先保留後續再來完成,加上// TODO:自我提醒。最後別忘了將這Action加到optionMenu裡,UIAlertController一樣有現成的Method addAction可以使用。
// 加上打電話動作
// TODO: Call Phone handler
let callAction = UIAlertAction(title: "打電話 \(restaurants[indexPath.row].phone)", style: .default, handler: nil)optionMenu.addAction(callAction)
3. 加上取消動作
跟上述加上打電話動作的步驟相同,但我們將style改為.cancel,表示取消。
// 加上"取消"動作
let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)optionMenu.addAction(cancelAction)
4. 最後,呈現選單
別忘了Apple文件的提醒,使用present(_:animated:completion) method呈現選單。
咦?我們是不是忘了什麼?是的,我們前面說還希望可以將喜愛的餐廳標示符號,既然我們已經學會如何使用UIAlertController,加上動作就只是一塊蛋糕囉!
// 加上打勾let checkInAction = UIAlertAction(title: "打勾", style: .default, handler:{
(action:UIAlertAction!) -> Void in
let cell = tableView.cellForRow(at: indexPath)
cell?.accessoryType = .checkmark
})optionMenu.addAction(checkInAction)
在handler我們使用了Closure作為值傳入,接下來讓我們看一下這段程式碼怎麼變出來的。
Closure可以看作是Function的變化,如果要將上面的Closure程式碼寫成function可以表示如下:
所以(action: UIAlertAction)仍是輸入參數,箭頭後方是回傳值型態,in後面就是執行本體。整段Closure可以直接放入UIAlertAction的初始化方法內作傳值,主要的目的就是讓程式碼更為簡潔。
執行看看,很棒喔!