我在lrvdetails.swift上有这门课
class LRVDetails {
var heading = CurrentValueSubject<String, Never>(K.LRV.Register)
// other publishers
}
我在LRVViewController.swift中有此分配
private var details = LRVDetails()
private var subs = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
details
.heading
.assign(to: \.text!, on: heading)
.store(in: &subs)
}
在LRVCoordinator.Swift我有
private var details = LRVDetails()
func UserDidPressButton() { // this is a delegate method from the VC
details.heading.send("New Heading")
}
我以为因为LRVDetails是一个类,所以它只存储一个引用。 所以如果我只是在每个文件中实例化它,然后对它调用send(),发布者应该更新,然后将值发送给LRVViewController订阅并更新标题。
但它什么也不做。 订户从不接收值(我用。print()运算符检查过)。 当我在协调器中调用lrvController?.details.send()时--没有private标记--它可以正常工作。
这是因为订阅服务器存储在LRVCoordinator中的'subs'变量中,因此必须用LRVViewController中的订阅服务器更新它吗? 那是我最好的赌注。
如果不是,为什么这不起作用?。
谢啦!
我以为因为LRVDetails是一个类,所以它只存储一个引用。 所以如果我只是在每个文件中实例化它,然后对它调用send(),发布者应该更新
你的理解是不正确的。 您已经创建了两个不同的LRVDetails
对象。 (语法lrvdetails()
创建一个新对象)一个在VC中,另一个在协调器中。 但是,它存储引用是正确的,因此,如果实际使两个details
变量引用相同的lrvdetails
,它就会工作。
但实际上,您似乎不需要在协调器中使用details
变量。 因为协调器是VC的委托,所以您可以通过委托方法传递lrvdetails
:
func UserDidPressButton(_ viewController: LRVViewController) {
viewController.details.heading.send("New Heading")
}
不用说,您还应该更改UserDidPressButton
的调用方,以传递self
作为参数。