0

MVVMデザインパターンを使用して、アプリでReactiveCocoaフレームワークを使用しています。

したがって、すべてのコントローラーに対して、ViewModel があります。Controller は彼の ViewModel にバインドされています。

UIButton バインディングは次のようになります。

@implementation HomeController

-(void) bindViewModel {
 self.viewHeader.buttonSide.rac_command = self.viewModel.execiteFullPortfolio;
}

それはすべてうまくいきますが、ViewModelにパラメータを渡したいとき、正しい方法がわかりません...

Stocks の UICollectionView があり、特定の株式をクリックするたびに、その株式のプロファイル ページに移動したいとします。そのロジックはViewModelで実行する必要がありますが、RACCommandで株式を渡すにはどうすればよいですか?

私が現在やっていることは次のとおりです。

@implementation HomeController
-(void) bindViewModel {
 __unsafe_unretained HomeController *weakSelf = self;
self.viewPortfolioPusherView.scrollGainView.blockSelect = ^ (STStock *stock){
        weakSelf.viewModel.selectedStock = stock;
        [weakSelf.viewModel.executeGoToStock execute:[RACSignal empty]];
    };

}


@implementation HomeViewModel
-(void) initialization {
  self.executeGoToStock = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        dispatch_async(dispatch_get_main_queue(), ^{
        [weakSelf moveToSelectedStock];
        });
        return [RACSignal empty];
    }];
}
-(void) moveToSelectedStock {
    [self stockProfileControllerLazy];
    self.stockProfileController.stock = self.selectedStock;
    [Navigator pushController:self.stockProfileController fromController:[self.delegate controller]];
}

これはベストプラクティスではないと確信しています!だから私は尋ねています、何ですか??

ありがとう 。

4

1 に答える 1

3

空のシグナルではなく、コマンドSTStockの呼び出しにインスタンスを渡さないのはなぜですか?execute

[weakSelf.viewModel.executeGoToStock execute:stock];

それで:

self.executeGoToStock = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(STStock *stock) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [weakSelf moveToSelectedStock:stock];
        });
        return [RACSignal empty];
}];

moveToSelectedStockパラメータを取るように変更する必要があることは明らかです。ただし、それを行う実装をもう少し進めRACCommandますNavigatorSTStockさらに、コレクションではなくインスタンス用に別のビュー モデルを作成します。したがって、銘柄を選択すると、次のようになります。

StockViewModel *viewModel = [[StockViewModel alloc] initWithStock:stock];
[[Navigator pushViewModel] execute:viewModel];

これは明らかにいくつかの詳細を省略しています。たとえば、ナビゲーターはビュー モデル クラスをコントローラー クラスにマップします。ビュー モデルがプッシュされると、対応するコントローラーが作成され、ビュー モデルがそれにバインドされます。

于 2014-09-14T14:08:44.497 に答える