查看模型依赖注入

View Model Dependency Injection

ItemDetailViewModel 使用以下签名初始化:

init(item: Item, didPressButton: Observable<Void>, api: FirebaseAPI)

它在 ItemDetailViewController 中初始化,它从源控制器的 segue 获得一个 Item。我意识到 ItemDetailViewController 在技术上是 View,因此它不应该将 Item 作为存储的 属性。我如何将 Item 转移到 ItemDetailViewModel?这也意味着 ItemListViewController 不应该有一个 selectedItem 存储 属性 在 prepareFor(segue:).

中使用

可能的解决方案

所以当CollectionView CellItemListViewController(源控制器)中被点击时,它应该通过绑定到存储Item触发ItemListViewModel,然后perform segue.同时,在 prepareForSegue 中,我使用 ItemListViewModelItemDetailViewModel 初始化为 Item。好的..那可以工作。

如何处理每次点击都会更改其图像的按钮点击?通过功能?

初始化 view modelsinject dependencies 的正确方法是什么?

您有一个对象需要构建三段数据,但其中一条数据与另外两条数据的来源不同。这是使用高阶函数的好时机。

struct ItemDetailViewModel {
    static func factory(item: Item, api: FirebaseAPI) -> (_ action: Observable<Void>) -> ItemDetailViewModel {
        return { action in 
            return ItemDetailViewModel(item: item, didPressButton: action, api: api)
        }
    }
}

您的视图控制器将接受此函数的结果:

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
    }
}

然后在您之前的视图控制器中准备转场:

if let controller = segue.destinationViewController as? ItemDetailViewController {
    controller.viewModelFactory = ItemDetailViewModel.factory(item: anItem, api: api)
}