ItemDetailViewModel
:
init(item: Item, didPressButton: Observable<Void>, api: FirebaseAPI)
它在ItemDetailViewController
中初始化,从源控制器的segue获取Item
。我意识到ItemDetailViewController
在技术上是View
,所以它不应该有Item
作为存储属性。我还如何将Item
转移到ItemDetailViewModel
?这也意味着ItemListViewController
不应该在selectedItem
中使用prepareFor(segue:)
存储的属性。
潜在解决方案
因此,当CollectionView Cell
(源控制器)中的ItemListViewController
被点击时,它应该通过绑定到存储ItemListViewModel
,然后Item
来触发perform segue
。同时,在prepareForSegue
中,我使用ItemListViewModel
使用ItemDetailViewModel
初始化Item
。好的..那可行。
如何处理按钮水龙头,它会在每个水龙头上改变图像?通过功能?
初始化view models
和inject dependencies
的正确方法是什么?
答案 0 :(得分:1)
您有一个对象需要构建三个数据,但其中一个数据来自与其他两个不同的数据源。这是使用高阶函数的好时机。
Some&& h() {
Some&& ro1 = f();
// Code skipped here
return std::forward<Some>(ro1);
}
void g1() {
Some&& ro2 = h();
// Is ro2 still refering to a valid object?
}
您的视图控制器将接受此功能的结果:
struct ItemDetailViewModel {
static func factory(item: Item, api: FirebaseAPI) -> (_ action: Observable<Void>) -> ItemDetailViewModel {
return { action in
return ItemDetailViewModel(item: item, didPressButton: action, api: api)
}
}
}
然后在您之前的视图中,控制器准备了segue:
class ItemDetailViewController: UIViewController {
var viewModelFactory: (Observable<Void>) -> ItemDetailViewController = { _ in fatalError("factory called before provided.") }
override func viewDidLoad() {
super.viewDidLoad()
let viewModel = viewModelFactory(myButton.rx.tap.asObservable())
// bind output to view model
}
}