如何在不同的视图控制器中跟踪变量 属性

How to keep track of variable property in different view controller

我有 3 个视图控制器:第一个 VC 我通过服务调用获取数据。获取的数据位于对象数组中。当第一个 VC 中的按钮被点击时,我将该对象数组传递给第二个 VC,它将在 table 视图中显示对象数组。在 table 视图单元格中有一个点赞按钮,它显示了对象的点赞总数。当我点击 table 视图单元格时,它会打开第三个 VC,其中显示详细信息以及类似按钮。

我这样传递对象:

func openImagesList() {
    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "ImagesList") as? ImagesListVC {            
        vc.imageModel = self.imagesModel
        self.navigationController?.pushViewController(vc, animated: true)
    }
}

现在对象在第 3 个和第 2 个 VC 中发生变化,但是当它发生变化时,我希望在第一个 VC 中也有相同的变化。我怎样才能跟踪这个?

使用委托的更现代的替代方法是使用闭包。例如,假设您想将数据从 SecondVC 传回 FirstVC:

class FirstVC: UIViewController {

    private func presentSecondVC() {
        let secondVC = SecondVC()
        secondVC.dataChangedHandler = dataChanged(data:)
        present(secondVC, animated: true)
    }

    private func dataChanged(data: SomeModel) {
        // do stuff with data
    }

}

SecondVC 中,您需要一个用于处理程序的变量:

class SecondVC: UIViewController {

    var dataChangedHandler: ((SomeModel) -> Void)?

    private var data: SomeModel = ...

    private func dataDidChange() {
        dataChangedHandler?(data)
    }

}

您使用的不是委托,而是 dataChangedHandler,一种来回传递数据的闭包。通过传递对 dataChanged(data:) 的引用,您可以轻松地将此方法扩展到三个视图控制器。

使用闭包简洁(您甚至不需要协议)且用途广泛。它也是非常模块化的,因为您不必直接公开 FirstVC.