0

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

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

4

1 回答 1

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

我想建议您结帐CocoaActionAction使用ReactiveSwift,它们是旧版ReactiveObjC的 RACCommand 的替代品。

于 2017-01-05T11:14:07.850 回答