rac_command仅响应单击

时间:2016-12-26 17:20:08

标签: ios swift reactive-cocoa reactive-cocoa-4

我试图在MVVM架构中第一次使用RAC来检测UIElement上的点击,比如使用Reactive Cocoa的按钮。

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

但是,当我弹出视图控制器并返回到原始viewController时,该命令只执行一次然后按钮处于禁用状态。如何检测按钮任意次数?

1 个答案:

答案 0 :(得分:1)

显然,你错过了什么,并且犯了一个简单的错误。

RACCommand期望点击按钮时活着的信号,并在点击业务逻辑后处置如创建viewModel ,然后执行上面的中的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: {
            })
        })
    }
}

我建议您在 ReactiveSwift 中结帐CocoaActionAction,它们可替代旧版 ReactiveObjC 的RACCommand。