首页 文章

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

提问于
浏览
1

我有三个视图控制器 .

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

4 回答

  • 0

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

    就像是

    import 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)调用它们.delegate = self

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

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

    编辑!!

    当您导航回VC2(VC3-> VC2)时,您应该引用您删除的数据,以便可以从dataSource(array,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")
          }
    
    }
    
  • 1

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

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

相关问题