簡體   English   中英

快速刪除行后如何刷新TableView?

[英]How to refresh tableview after deleting row in swift?

我有三個視圖控制器。

VC1和VC3是UITableViewControllers子類,VC2是UIViewController子類。

VC1將一些數據傳遞給VC2。 VC2使用userdefaults將數據保存到數組。 然后,VC2使用segue將此數據傳遞給VC3。 VC3以表格視圖顯示數據。

我添加了滑動手勢以從VC3的表視圖中刪除數據。 而且效果很好。 但是當我返回(VC3-> VC2)並再次返回(VC2-> VC3)時,已刪除的行仍然存在數據。 但是當我轉到VC3-> VC2-> VC1並再次返回VC1-> VC2-> VC3時,我發現刪除的行實際上已刪除。 我想當VC3> VC2然后VC2> VC3時將不存在已刪除的數據。

所有視圖控制器都在UINavigationController堆棧中。 代碼是用Swift 2編寫的。

為什么不為具有相應表的所有視圖編寫函數。

就像是

導入Foundation導入UIKit

class DeleteRows{
    class func removeRowAtIndexPath(indexPathRow: Int, indexPathSec: Int, table: UITableView) -> UITableView{
arrayOfSomethin.removeAtIndex(indexPathRow)
    let index = NSIndexPath(forItem: indexPathRow, inSection: indexPathSec)
    table.deleteRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Left)

    return table
}
}

您可以通過DeleteRows.removeRowAtIndexPath(indexPathRow:0,indexPathSec:0,table:Yourtable)來調用它們。

您需要從數據源中刪除數據,並使用tableview.reloadData()更新tableview

編輯!!

當您導航回VC2(VC3-> VC2)時,應該引用刪除的數據,以便可以從dataSource(array,nsuserdefaults)中刪除該數據。 這樣,當您要從VC2-> VC3導航時,您將從NSUserDefaults中獲取一個新的數組,然后使用該新數據重新加載tableview。

但我建議您為您簡化此過程。 看來您正在為自己制造麻煩。 如果要使用來自多個viewController的數據訪問數組,則應使用包含該數組的類制作一個新文件。 看一下下面的sudo代碼:

"dataSource.swift"


Class DataSource{
    var arrayWithData = [String]()


    init(){
         let userDefault = NSUserDefaults.standardUserDefaults()
         self.arrayWithData = userDefaults.arrayForKey("arrayData")
    }

     func deleteData(){
         //Edit the self.arrayWithData and then run this method
         let userDefault = NSUserDefaults.standardUserDefaults()
         userDefault.updateValue(self.arrayWithData, forKey "arrayData")
      }

}

最佳解決方案 您所遇到的解決方案之一可能是使用通知模式。

從您的VC3類發送通知:

NSNotificationCenter.defaultCenter().postNotificationName("ObjectDeleted", object: ["object" : object])

在VC1和VC2中,您必須訂閱刪除事件(在viewDidLoad()的某個位置)

NSNotificationCenter.defaultCenter().addObserver(self,
                                                 selector: #selector(VC1.objectDeleted(_:)),
                                                 name: "ObjectDeleted",
                                                 object: nil)

您可以像這樣處理它:

func objectDeleted(notification: NSNotification) {

    guard let object = userInfo["object"] as? YourObjectClass else { return }
    guard let index = dataArray.indexOf(object) else { return }

    dataArray.removeAtIndex(index)
    tableView.deleteRowsAtIndexPaths([NSIndexPath.init(forRow: index, inSection: 0)], withRowAnimation: .Automatic)
}

對於VC2,您還可以在上面的函數中更新NSUserDefaults容器。

使用iOS 8或更早版本,您需要先取消注冊此通知,然后再釋放觀察者對象(在您的情況下為VC1或VC2)。 如果您忘記了通知中心將下一個通知發送給不再存在的對象的話,就有崩潰的危險。 因此,不要忘記添加一個deinit調用

deinit {
   NSNotificationCenter.defaultCenter().removeObserver(self)
}

刪除后,您將需要更新數據。

在viewDidLoad()或delete方法的末尾,添加:

tableview.reloadData()

這應該有助於更新視圖。

要存儲/保留數據,請使用UserDefaults。

func storeData(name: String) {

    let defaults = UserDefaults.standard
    defaults.set(name, forKey: "Name")
    defaults.synchronize() // Save Data

}

func getData() -> String {

    if let name = UserDefaults.standard.object(forKey: "Name") {
        return name as! String
    } else {
        return "" // error in retrieving data (ex: name not found)
    }

}

第一件事是從填充tableView的數據源中刪除數據。 您最有可能擁有某些類/結構類型的數組,例如let usersArray = [Users]()
然后,您需要從tableView中刪除該行。
注意!!! 如果您使用reload tableView.reloadRows(at: [indexPath], with: .automatic)則應用程序將崩潰。 此方法的作用就像您要插入一行,但是您的數據源告訴您該特定索引沒有數據,因此應使用table.deleteRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Left)

//remove users from dataSource
  usersArray.remove(at:indexPath.row)
 //delete the row of the tableView
  table.deleteRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Left)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM