如何防止UIViewController在segue期间重新实例化?

时间:2017-07-15 18:00:25

标签: swift uitableview uiviewcontroller

我在UIViewController里面有一个UITableView(让我们调用那个视图控制器B),我一次填充一个对象。对象在先前的UIViewController(视图控制器A)中创建,并在视图控制器A的prepare(for segue:_)函数中添加到表的数据源(也是视图控制器B)。这会将一个对象添加到在该表中,用户可以点击“添加到表”单元格,将它们带回控制器A,并重复该过程。问题是每次我返回到视图控制器B时,表视图只有最近添加的对象。我相信这是因为每个segue都在创建一个它正在移动的ViewController的新实例。我如何防止这种情况,或者找到一个更好的地方来存储每次都不会重新实例化并覆盖为空列表的tableview数据源?

查看控制器A

class ViewControllerA : UIViewController {

    var object = MyObject(...)

    ...

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let viewB = segue.destination as! ViewControllerB


        viewB.dataSource.append(object) //


    }
}

查看控制器B

class ViewControllerB: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var dataSource = [MyObject]()

    //DataSource functions fill table with dataSource array objects
    ...
}

3 个答案:

答案 0 :(得分:1)

丢失数据的原因是每当您尝试执行segue时重新创建视图控制器B.因此,为了保存数据,必须将数据从视图控制器B传递回视图控制器A.然后,当您在视图控制器A上单击其他内容时,需要将新数据附加到现有数据,然后传递给控制器​​B试。

要传回数据,您需要查看展开segue。 Here是实施的一个很好的例子。

答案 1 :(得分:0)

当您点击"添加到表"时,您可以将整个数组传递回ViewController A.按钮。然后,将新对象附加到整个列表并将其分配给ViewController B中的变量

A:

class ViewControllerA : UIViewController {

    var dataSource = [MyObject]()  // Now you have a dataSource variable in both viewControllers
    var object = MyObject()

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let viewB = segue.destination as! ViewControllerB

        dataSource.append(object)  // Add the new object
        viewB.dataSource = dataSource  // Assign the newly-updated array
    }
}

B:

class ViewControllerB: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var dataSource = [MyObject]()

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        let viewA = segue.destination as! ViewControllerA

        viewA.dataSource = dataSource
    }
}

答案 2 :(得分:0)

这是正确的,因为每次从ViewControllerB转换回ViewControllerA时,ViewControllerB都会从内存及其数据源中释放出来。我建议您在dataSource中实例化ViewControllerA时从ViewControllerB传递prepareForSegue数组。像这样......

class ViewControllerA : UIViewController {
    var selectedItems: MyObject = []
    var object = MyObject(...)

...

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let viewB = segue.destination as! ViewControllerB

    viewB.dataSource = selectedItems
}

这样,即使在ViewControllerA被取消分配后,ViewControllerB也会跟踪所有选定的项目。