開始用Swift開發(fā)iOS 10 - 9 Table Row的刪除, UITableViewRowAction和UIActivityViewController的使用

上一篇開始用Swift開發(fā)iOS 10 - 8 Table View和UIAlertController的交互是Table Row選擇的操作,這一篇繼續(xù)上一篇的代碼實現(xiàn)刪除操作。

滑動刪除

  • 實現(xiàn)UITableViewDataSource中相應方法:
  override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        
    }

此時滑動有刪除按鈕:

  • 刪除數(shù)據(jù)
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            restaurantNames.remove(at: indexPath.row)
            restaurantLocations.remove(at: indexPath.row)
            restaurantTypes.remove(at: indexPath.row)
            restaurantIsVisited.remove(at: indexPath.row)
            restaurantImages.remove(at: indexPath.row)
        }
}

UITableViewCellEditingStyle有兩種insertdelete。
運行后發(fā)現(xiàn)刪除動作后,相應的table view row被沒有消失,因為上面的刪除只是刪除了相應數(shù)組中的數(shù)據(jù),并沒有在視圖上顯示,如要重新加載才會刪除。

重新加載UITableView

tableView(_:commit:forRowAt:)后添加:
tableView.reloadData()
另外,更好的刷新table view的方法是使用UITableViewdeleteRows(at:with:)方法,還有動畫效果:
tableView.deleteRows(at: [indexPath], with: .fade)

用UITableViewRowAction為滑動產(chǎn)生更多動作

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
       // 1 
        let shareAction = UITableViewRowAction(style: .default, title: "Share", handler: {
            (action, indexPath) -> Void in
            // 3
            let defaultText = "Just checking in at " + self.restaurantNames[indexPath.row]
            let activityController = UIActivityViewController(activityItems: [defaultText], applicationActivities: nil)
            self.present(activityController, animated: true, completion: nil)
        })
        // 1
        let deleteAction = UITableViewRowAction(style: .default, title: "Delete", handler: {
            (action, indexPath) -> Void in
            
            self.restaurantNames.remove(at: indexPath.row)
            self.restaurantLocations.remove(at: indexPath.row)
            self.restaurantTypes.remove(at: indexPath.row)
            self.restaurantIsVisited.remove(at: indexPath.row)
            self.restaurantImages.remove(at: indexPath.row)
            
        })
        // 2
        return [deleteAction, shareAction]
    }
  • 1 UITableViewRowAction的用法和UIAlertAction類似。style相同,具體功能是在回調(diào)閉包中實現(xiàn)的。
  • UIActivityViewController繼承是UIViewController,提供一些服務,例如拷貝到剪貼板,分享內(nèi)容到社交媒體,通過Messages發(fā)送項目等。
  • 一旦實現(xiàn)了tableView(_:editActionsForRowAt:)方法,tableView(_:commit:forRowAt:)方法產(chǎn)生delete按鈕將不再產(chǎn)生,所以要在tableView(_:commit:forRowAt:)中添加delete按鈕。
  • 2 返回的UITableViewRowAction的數(shù)組,action的顯示順序是,按照數(shù)組的順序在屏幕從有到左顯示。
  • 3 defaultText是分享的內(nèi)容,不僅可以是文本,也可以添加圖片對象UIImage。此處代碼修改一下:
let defaultText = "Just checking in at " + self.restaurantNames[indexPath.row]
if let imageToShare = UIImage(named: self.restaurantImages[indexPath.row]) {
    let activityController = UIActivityViewController(activityItems: [defaultText, imageToShare], applicationActivities: nil)
    self.present(activityController, animated: true, completion: nil)
}
3407495D-9E60-4E6C-8EFA-31A562A14907.png

定制UITableViewRowAction

可以修改背景顏色:

shareAction.backgroundColor = UIColor(red: 48.0/255.0, green: 173.0/255.0,
                                              blue: 99.0/255.0, alpha: 1.0)
        deleteAction.backgroundColor = UIColor(red: 202.0/255.0, green: 202.0/255.0,
                                               blue: 203.0/255.0, alpha: 1.0)

代碼

Beginning-iOS-Programming-with-Swift

說明

此文是學習appcode網(wǎng)站出的一本書 《Beginning iOS 10 Programming with Swift》 的一篇記錄

系列文章目錄

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容