如何在不同的视图控制器中跟踪变量 属性
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
.
我有 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
.