【发布时间】:2017-08-19 08:24:46
【问题描述】:
在我第一次设置登录视图并使用响应式编程时 - 我无法从 ViewContoller 生成信号,该信号将在我的视图中使用包含我的表单验证的 Bool 提醒我的 observeValues 侦听器:
查看文件
viewModel.outputs.loginSuccess
.observeValues { [weak self] value in
print(value)
}
每次更改电子邮件或密码文本字段时,我当前的代码loginSuccess 都会触发(我的视图文件中有.addTarget 会更新我的模型视图文件中的 MutableProperites)。我遇到问题的地方是为 tryLogin 创建一个仅在按下登录按钮时发出的信号,然后映射我的表单验证 (emailAndPassword.map(isValid)),我可以在我的视图文件中对其进行响应。
模型视图文件
import ReactiveCocoa
import ReactiveSwift
import Result
public protocol LoginViewModelInputs {
/// String value of email textfield text
func emailChanged(_ email: String?)
/// String value of password textfield text
func passwordChanged(_ password: String?)
/// Call when login button is pressed.
func loginButtonTapped()
}
public protocol LoginViewModelOutputs {
/// Emits on login.
var loginSuccess: Signal<(Bool), NoError> { get }
}
public protocol LoginViewModelType {
var inputs: LoginViewModelInputs { get }
var outputs: LoginViewModelOutputs { get }
}
public final class LoginViewModel: LoginViewModelType, LoginViewModelInputs, LoginViewModelOutputs {
public init() {
let emailAndPassword = Signal.combineLatest(
self.emailChangedProperty.signal.skipNil(),
self.passwordChangedProperty.signal.skipNil()
)
let tryLogin = loginButtonTappedProperty.map {
emailAndPassword.map(isValid)
}
self.loginSuccess = tryLogin.value
}
fileprivate let emailChangedProperty = MutableProperty<String?>(nil)
public func emailChanged(_ email: String?) {
self.emailChangedProperty.value = email
}
fileprivate let loginButtonTappedProperty = MutableProperty()
public func loginButtonTapped() {
self.loginButtonTappedProperty.value = ()
}
fileprivate let passwordChangedProperty = MutableProperty<String?>(nil)
public func passwordChanged(_ password: String?) {
self.passwordChangedProperty.value = password
}
public let loginSuccess: Signal<(Bool), NoError>
public var inputs: LoginViewModelInputs { return self }
public var outputs: LoginViewModelOutputs { return self }
}
func isValid(email: String, password: String) -> Bool {
return !email.characters.isEmpty && !password.characters.isEmpty
}
感谢任何帮助。我没有找到太多好的文档来了解信号或观察者,但可能我没有找到正确的地方。
【问题讨论】:
标签: swift mvvm reactive-programming reactive-cocoa rx-swift