如何在删除swift中的行后刷新tableview?

时间:2016-07-17 16:54:38

标签: ios swift uitableview

我有三个视图控制器。

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编写的。

5 个答案:

答案 0 :(得分:2)

为什么不用相应的表为所有视图编写函数。

就像

导入基金会 导入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)调用它们.delegate = self

答案 1 :(得分:0)

您需要从数据源中删除数据并使用tableview.reloadData()

更新tableview

EDIT !!

当您导航回VC2(VC3-> VC2)时,您应该引用您删除的数据,以便可以从dataSource(数组,nsuserdefaults)中删除它。 这种方式当你想从VC2导航 - > VC3你将从NSUserDefaults带来一个新数组,然后用新数据重新加载tableview。

但我建议你让这个更简单。好像你在为自己制造麻烦。如果要使用来自多个viewControllers的数据访问数组,则应使用包含该数组的类创建一个新文件。看看这个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")
      }

}

答案 2 :(得分:0)

最佳解决方案您的案例中的一个解决方案可能是使用通知模式。

从VC3课程发送通知:

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

在你的VC1& VC2你必须订阅删除事件(某处 viewDidLoad()

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)
}

你可以像下面那样处理它:

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

对于VC2,您也可以在上面的函数中更新NSUserDefaults容器。

使用iOS 8或更早版本,您需要在取消分配观察者对象(在您的情况下为VC1或VC2)之前取消注册此通知。如果您忘记了当通知中心将下一个通知发送到不再存在的对象时,您将面临崩溃的风险。所以不要忘记添加一个deinit电话

systemProp.http.proxyHost=127.0.0.1
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=127.0.0.1
systemProp.https.proxyPort=8080

答案 3 :(得分:0)

删除后需要更新数据。

在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)
    }

}

答案 4 :(得分:0)

第一件事是从填充tableView的数据源中删除数据。您最有可能拥有某些类/结构类型的数组,例如let usersArray = [Users]()
然后,您需要从tableView中删除该行。
注意!!!如果您使用重新加载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)