繁体   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