2016-12-26 50 views
0

我想在MVVM體系結構中首次使用RAC來檢測使用Reactive Cocoa的按鈕在UIElement上的點擊。rac_command只響應單擊

我在我的ViewController中爲我的按鈕設置了rac_command。

addContactBtn.rac_command = viewModel.addContact 

我的視圖模型執行以下操作:

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: { 
    }) 
    }) 
} 
} 

但是,該命令只執行一次,然後該按鈕處於禁用狀態,當我彈出視圖控制器,回到原來的viewController。如何檢測按鈕點擊多少次?

回答

1

顯然,你錯過了一些東西,並有一個簡單的錯誤。

RACCommand預期這將是活着當按鈕按下並點擊業務邏輯(喜歡在上述創建視圖模型,然後pushViewModel)執行之後設置的信號。也就是說,每個按鈕點擊事件關聯一個信號,不共享一個唯一的信號,但具有共同的信號內部邏輯。如果信號沒有達到完成或錯誤,則響應的點擊事件未完成,因此按鈕已禁用

以下修改後的代碼可能是正確的。

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: { 
      }) 
     }) 
    } 
} 

我想建議你結帳CocoaActionActionReactiveSwift,這是替代傳統ReactiveObjC的RACCommand。

+0

我無法找到具有示例的良好文檔以開始使用ReactiveSwift或RAC 5.0。任何線索將不勝感激。 – Ajax

+0

@Ajax我忍不住了,也許官方文檔是一個很好的選擇,這是非常有用的。 – xohozu