[APP開發-使用Swift] 8. UIAlertController 與Table View互動

Chiwen Lai
5 min readSep 30, 2017

--

在前一篇文章7. UITableView Custom Cell 我們完成了可以顯示我們喜愛餐廳的表格,接下來我們希望點選某一間餐廳,可以讓我們打電話給餐廳訂位,或者將喜愛的餐廳標示符號。

觀念介紹:Delegation中我們提過,針對表格的事件處理可以找UITableViewDelegate這位專家,發現didSelectRowAt indexPath應該很適合處理點選餐廳後的動作。在Xcode只要輸入selectrow就會帶出相關的function作挑選,找到didSelectRowAt按Enter即可。

為了可以同時滿足在點選某一間餐廳之後,可以選擇打電話給餐廳,或者標示符號,我們將使用Swift裡的提示訊息UIAlertController。先觀看結果如下:

接下來針對上圖的各步驟做說明:

  1. 新增一個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的初始化方法內作傳值,主要的目的就是讓程式碼更為簡潔。

執行看看,很棒喔!

>>>觀念介紹: Optionals

>>>9. Swipe 向左滑動

--

--