Я делаю проверку формы с использованием реактивной скорости. Но я столкнулся с проблемой сброса значения значения &.Сигналы и наблюдатели (Reactive Swift) для проверки формы не работают должным образом
Когда я заполняю все текстовое поле правильно, как указано в правиле проверки, все сигналы (текстовые значения сплошного контекста) создают истинное значение, которое позволит мне отправлять данные формы. Я возвращаю значения текстового поля после завершения отправки формы. После этого я отправляю ложное значение ко всему сигналу Observer. Но когда я начну заполнять текстовое поле, он получит предыдущий истинный сигнал и позволит мне отправлять данные без применения правила валидации. это означает, что я не могу сбросить значение сигнала
Любая помощь была бы действительно оценена.
Моя проблема:
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 [email protected]".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
}
}
}
Я сделал решение этой проблемы, но я не думаю, что это идеальный способ и реактивная не так, как я сделал, чтобы решить. Я жду идеального или самого приемлемого решения. Любая помощь или ответ действительно оценены.
Я делаю так, как вы намереваетесь, но не полностью, но все еще пытаетесь понять, как работает CocoaAction. Я думаю, что это лучший метод, который я нашел до этого времени. Я буду отмечать этот ответ как правильный, как только действие будет успешным. – rjndra
Мне нравится думать о «Action» (https://github.com/ReactiveCocoa/ReactiveSwift/blob/master/Sources/Action.swift) в качестве своего рода «Factory Signal Producer Factory». Если вы знакомы с RAC 2.0, это эквивалентно RACCommand. Вы выполняете действие с помощью ввода, и оно возвращает вам SignalProducer, который выполняет фактическую работу и отправляет свои результаты в виде событий. – MeXx
'CocoaAction' - это всего лишь обертка для активации действия UIKit. Вариант, который я использовал в примере, использует 'inputTransformer' для определения фактического ввода для действия каждый раз, когда он выполняется. – MeXx