2016-12-26 38 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