我试图在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时,该命令只执行一次然后按钮处于禁用状态。如何检测按钮任意次数?
答案 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 中结帐CocoaAction
和Action
,它们可替代旧版 ReactiveObjC 的RACCommand。