我有两个屏幕:
# install.packages("devtools")
devtools::install_github("thomasp85/patchwork")
library(ggplot2)
p1 <- ggplot(mtcars) + geom_point(aes(mpg, disp))
p2 <- ggplot(mtcars) + geom_boxplot(aes(gear, disp, group = gear))
library(patchwork)
p1 + p2
:包含用于从其他视图中选择客户端的文本字段NewControlTableViewController
:第二个视图包含可以选择的列表客户端两个屏幕共享一个视图模型。
所以这是我的代码:
ClientsTableViewController
每当我查看第一个屏幕时,都会触发事件(空值),然后,在从第二个屏幕选择客户端之后,由于某种原因,没有事件被触发。
答案 0 :(得分:0)
首先,不推荐使用Variables
。
您应该使用不需要初始值的PublishRelay
,这样在第一个屏幕上订阅时就不会触发它。
继电器的优点是它们不会出错或完成。
struct NewControlViewModel {
let selectedClient = PublishRelay<Client>()
}
// NewControlTableViewController : viewDidLoad
choisirMandat.rx.tap.subscribe(onNext: { [unowned self] in
let viewController = /* instantiate vc */
// Make sure to use the same viewModel
viewController.viewModel = self.viewModel
self.present(viewController, animated: true)
}).disposed(by: disposeBag)
self.viewModel.selectedClient.debug().subscribe().disposed(by: self.disposeBag)
// ClientsTableViewController: viewDidLoad
tableView.rx.itemSelected.map { [unowned self] indexPath in
return self.clients[indexPath.row]
}
.debug("client selected", trimOutput: true)
.do(onNext: { [unowned self] _ in
self.navigationController?.popToRootViewController(animated: true)
})
.bind(to: self.viewModel.selectedClient)
.disposed(by: self.disposeBag)
另一方面,如果您希望功能齐全,客户端应该也可能来自Rx世界。
第二方面,您可以使用debug()
运算符来打印事件。
bind(to:)
,因此请务必保持最新状态
答案 1 :(得分:-1)
我想我在这里找到了你的问题。你正在做的是
// NewControlTableViewController : viewDidLoad
viewModel.selectedClient.asObservable().subscribe { event in
debugPrint(event)
}
// ClientsTableViewController: viewDidLoad
tableView.rx.itemSelected.subscribe(onNext: { indexPath in
let client = self.clients[indexPath.row]
debugPrint(client)
self.viewModel.selectedClient.value = client
self.navigationController?.popToRootViewController(animated: true)
}).disposed(by: self.disposeBag)
您需要更改此行&#34; self.viewModel.selectedClient.value = client&#34;。您需要使用以前的控制器实例或NewControlTableViewController实例,如self.newControlTableVC.selectedClient.value = client
我认为你试图通过从NewControlTableViewController向ClientsTableViewController发送值来使用viewmodel。
此外,我做了你做过的同样的场景,在我的情况下效果非常好。只要尝试我的方案,如果它不起作用必须有一些小问题。
我希望它可以提供帮助