[APP開發-使用Swift] 9. Swipe 向左滑動

Chiwen Lai
5 min readOct 3, 2017

--

8. UIAlertController 與Table View互動中,我們點選某一間餐廳可以打電話也可以訂位,接下來我們看看iOS很常用的向左滑動功能,裡面就已經內建刪除的功能。讓我們查詢UITableViewDataSource的文件,裡面提到tableView(_:commit:forRowAt:)這個method可作刪除。

接下來讓我們實作,加入以下程式碼:

// Swipe-to-deleteoverride func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {    if editingStyle == .delete {
restaurants.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
}
}

執行看看,刪除成功!

可是,向左滑動只能做刪除嗎?我們是否可以客製自己的向左滑動選單呢?可以的,這時候我們就需要Swipe-for-more的功能。

自iOS 8開始提供了UITableViewAction這個Class讓我們可以很容易地自訂向左滑動的選單,查詢UITableViewDelegate,用tableView(_:editActionsForRowAt:)即可處理滑動的功能。

接下來我們希望將我們記錄的餐廳分享到Facebook,向左滑動的時候新增一個分享的按鈕。先看結果:

  1. 設定shareAction為UITableViewRowAction的物件。
  2. 利用UIActivityViewController提供的標準服務,例如複製、發送訊息、分享內容至社群網站等,就可以很簡單地達到我們要的功能。如果沒有出現Facebook的Logo,請使用Command+Shift+H回到主畫面,選擇設定 → Facebook,點進去做登入,再回來我的餐廳App重新點選分享即可。
  3. 最後將shareAction加到return的陣列中,告訴table view當使用者滑動的時候要增加分享的按鈕。

發現了嗎?我們先前加的刪除的按鈕不見了!因為一旦加上tableView(_:editActionsForRowAt:),實行我們自訂的功能,table view就不會再幫我們產生刪除的按鈕了,這時候我們就得自己來囉! 先新增一個deleteAction,再來直接把先前的程式搬到editActionsForRowAt內即可。

// 刪除按鈕let deleteAction = UITableViewRowAction(style: .default, title: "刪除", handler: { (action, indexPath) -> Void in    // Delete the row from the data source
self.restaurants.remove(at: indexPath.row)
self.tableView.deleteRows(at: [indexPath], with: .fade)
})

可以順便修改Button的背景顏色:

shareAction.backgroundColor = UIColor.blue
deleteAction.backgroundColor = UIColor.darkGray

別忘了加到return的陣列裡:

return [shareAction, deleteAction]

執行看看,很好!

如果我們希望分享的內容裡可以增加圖片,可以怎麼做呢?還記得我們在觀念介紹: Optionals提過的Optional Binding? 用if let判斷圖片是否有值,有的話imageToShare就加到UIActivityController裡面,UIActivityController就會自動把圖片加到分享內容裡囉!

執行後按分享 → Facebook看看,圖片出現了!

>>>10. Navigation Controller、Segue

--

--