2016-12-26 10 views
0

MVACアーキテクチャでRACを初めて使用するReactive Cocoaを使用して、ボタンのようなUIElementのクリックを検出しようとしています。rac_commandは1回のクリックでのみ応答します

自分のViewControllerにボタンのrac_commandを設定しました。

addContactBtn.rac_command = viewModel.addContact 

私のViewModelには、以下を行います。

func init(){ 
self.addContact = RACCommand() { 
    (any:AnyObject!) -> RACSignal in 
    return RACSignal.createSignal({ 
    (subscriber: RACSubscriber!) -> RACDisposable! in 
    print("creating viewModel") 
    let viewModel = ContactAddViewModel(services: self.services) 
    self.services.pushViewModel(viewModel) 

    return RACDisposable(block: { 
    }) 
    }) 
} 
} 

しかし、コマンドは1回だけ実行され、私はビューコントローラをポップし、元のViewControllerに来たときに、ボタンが無効状態になっています。どのくらいボタンを何回クリックしても何回検出できますか?

答えて

1

明らかに、あなたは何かを見逃して、簡単な間違いがありました。

RACCommandは、ボタンがクリックされたときに生きを可能とが実行クリックビジネスロジック(は上記にViewModelに、そしてpushViewModelを作成するなど)の後にを配置することになる信号に期待しています。すなわち、各ボタンclick-eventは信号を関連づけ、1つの固有信号を共有せず、共通信号内部論理を有する。シグナルが完了またはエラーを達成しない場合、応答するクリック事象は、ボタンがが無効にされ、となるように終了しない。

以下の変更されたコードは正しいかもしれません。

func init(){ 
    self.addContact = RACCommand() { 
     (any:AnyObject!) -> RACSignal in 
     return RACSignal.createSignal({ 
      (subscriber: RACSubscriber!) -> RACDisposable! in 
      print("creating viewModel") 
      let viewModel = ContactAddViewModel(services: self.services) 
      self.services.pushViewModel(viewModel) 

      // if you like to expose some value 
      // subscriber.sendNext(value) 

      subscriber.sendCompleted() // which makes clicking-event finished 

      // maybe error occurs 
      // subscriber.sendError() 

      return RACDisposable(block: { 
      }) 
     }) 
    } 
} 

私はレガシーReactiveObjCのRACCommandの代替である、ReactiveSwiftCocoaActionActionをチェックアウトすることをアドバイスしたいと思います。

+0

ReactiveSwiftまたはRAC 5.0を使い始めるための例が書かれていませんでした。どんなリードも感謝します。 – Ajax

+0

@Ajax私はもっと助けることができませんでした。多分公式の文書は非常に参考になる良い選択です。 – xohozu

関連する問題