【发布时间】:2017-06-01 02:52:40
【问题描述】:
我正在使用响应式 swift 进行表单验证。但是我在重置值和信号值时遇到了问题。
当我按照验证规则的指示正确填写所有文本字段时,所有信号(文本字段连续文本值)都会产生真值,这将允许我发送表单数据。完成表单提交后,我重置了文本字段的值。之后,我向所有信号观察者发送错误值。但是当我开始填充文本字段时,它将获得先前的真实信号,并允许我在不应用任何验证规则的情况下发送数据。这意味着我无法重置信号值
任何帮助将不胜感激。
我的问题:
import UIKit
import ReactiveSwift
import Result
class ContactVC: BaseViewController {
@IBOutlet weak var textFieldName: JVFloatLabeledTextField!
@IBOutlet weak var textFieldPhoneOL: JVFloatLabeledTextField!
@IBOutlet weak var textViewComent: UITextView!
@IBOutlet weak var textFieldLocationOL: JVFloatLabeledTextField!
@IBOutlet weak var textFieldEmailOL: JVFloatLabeledTextField!
@IBOutlet weak var btnSubmitOL: PGSpringAnimation!
var (nameValidationSignal, nameValidationObserver) = Signal<Bool, NoError>.pipe()
var (phoneValidationSignal, phoneValidationObserver) = Signal<Bool, NoError>.pipe()
var (emailValidationSignal, emailValidationObserver) = Signal<Bool, NoError>.pipe()
var (locationValidationSignal, locationValidationObserver) = Signal<Bool, NoError>.pipe()
var (commentValidationSignal, commentValidationObserver) = Signal<Bool, NoError>.pipe()
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
self.formValidation()
}
// MARK: - submit button action
@IBAction func btnSubmitAction(_ sender: Any) {
let params = ["name":textFieldName.text!,"email":textFieldEmailOL.text!,"location":textFieldLocationOL.text!,"message":textViewComent.text!,"phone":textFieldPhoneOL.text!]
APIManager(urlString:enumUrl.ContactAdmin.mainURL(),parameters:params as [String : AnyObject]?,method: .post).handleResponse(viewController: self, progressMessage: "downloading", completionHandler: { (response : AllResponse) in
self.nameValidationObserver.send(value: false)
self.emailValidationObserver.send(value: false)
self.phoneValidationObserver.send(value: false)
self.locationValidationObserver.send(value: false)
self.commentValidationObserver.send(value: false)
self.btnSubmitOL.backgroundColor = UIColor.gray
self.btnSubmitOL.isUserInteractionEnabled = false
})
}
// MARK: - validation textfield
func formValidation(){
self.btnSubmitOL.backgroundColor = UIColor.gray
self.btnSubmitOL.isUserInteractionEnabled = false
// Create signals
// Signals for TextFields
self.nameValidationSignal = self.textFieldName.reactive.continuousTextValues
.map{ ($0?.characters.count ?? 0) >= 3 }
self.phoneValidationSignal = self.textFieldPhoneOL.reactive.continuousTextValues
.map{ ($0?.characters.count ?? 0 ) >= 8 }
self.emailValidationSignal = self.textFieldEmailOL.reactive.continuousTextValues
.map{ $0?.isEmail ?? false }
self.locationValidationSignal = self.textFieldLocationOL.reactive.continuousTextValues
.map{ ($0?.characters.count ?? 0) >= 3 }
self.commentValidationSignal = self.textViewComent.reactive.continuousTextValues
.map{ ($0?.characters.count ?? 0) >= 5 }
// Observe TextFields Singals for Changing UI
self.nameValidationSignal.observeValues { value in
self.textFieldName.floatingLabelActiveTextColor = value ? UIColor.red : UIColor.black
self.textFieldName.floatingLabel.text = value ? "name".localize : "Name must be greater than 4 characters".localize
}
self.phoneValidationSignal.observeValues { value in
self.textFieldPhoneOL.floatingLabelActiveTextColor = value ? UIColor.red : UIColor.black
self.textFieldPhoneOL.floatingLabel.text = value ? "phone".localize : "Phone must be greater than 7 characters".localize
}
self.emailValidationSignal.observeValues { value in
self.textFieldEmailOL.floatingLabelActiveTextColor = value ? UIColor.red : UIColor.black
self.textFieldEmailOL.floatingLabel.text = value ? "email".localize : "Email must be of type example@test.com".localize
}
self.locationValidationSignal.observeValues { value in
self.textFieldLocationOL.floatingLabelActiveTextColor = value ? UIColor.red : UIColor.black
self.textFieldLocationOL.floatingLabel.text = value ? "location".localize : "Loation must be greater than 4 characters".localize
}
self.commentValidationSignal.observeValues { value in
self.textViewComent.textColor = value ? UIColor.red : UIColor.black
}
let formValidationSignal = nameValidationSignal.combineLatest(with: phoneValidationSignal).combineLatest(with: emailValidationSignal).combineLatest(with: locationValidationSignal).combineLatest(with: commentValidationSignal)
.map {
$0.0.0.0 && $0.0.0.1 && $0.0.1 && $0.1 && $1
}
formValidationSignal.observeValues {
self.btnSubmitOL.isUserInteractionEnabled = $0
self.btnSubmitOL.backgroundColor = $0 ? UIColor.appRedColor() : UIColor.gray
}
}
}
我已经解决了这个问题,但我认为这不是完美的方法,而且反应式不是我解决的方法。 我正在等待完美或最被接受的解决方案。 非常感谢任何帮助或答案。
【问题讨论】:
标签: swift mvvm functional-programming reactive-cocoa bidirectional