RxSwiftのObservableにDisposeBag処理を行うと、画面起動後の処理に反応しなくなる
RxSwiftを始めて間もないため、タイトルが変でしたらご了承ください。
RxSwiftのサンプルにある、Simple Validationを写経して学習していました。
https://qiita.com/kzykbys/items/3bbb4fa24d30917afd05#simple-validation
その際、Observableにbind処理をし、その後disposedでDisposeBagを設定すると、textFieldに値を入れても、バリデーションの処理が行われません。
変わりにdisposedをコメントアウトすると、処理が動くようになりました。
RxSwiftのサンプルではdisposedを使っても動作していたため、理由がわからず困っています。
RxSwiftのバージョンは4.3.1です。
こちらの画面を初期画面として呼び出しています。
どうぞよろしくおねがいします。
import UIKit
import RxSwift
import RxCocoa
fileprivate let minimalUsernameLength = 5
fileprivate let minimalPasswordLength = 5
class ValidationViewController: UIViewController {
@IBOutlet weak var userNameTextField: UITextField!
@IBOutlet weak var passwordTextField: UITextField!
@IBOutlet weak var userNameDescriptionLabel: UILabel!
@IBOutlet weak var passwordDescriptionLabel: UILabel!
@IBOutlet weak var loginButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
let disposeBag = DisposeBag()
let usernameValidate = userNameTextField.rx.text.orEmpty
.map{ text -> Bool in
print("比較処理実行")
return text.count >= 5
}
.share(replay: 1)
let passwordValidate = passwordTextField.rx.text.orEmpty
.map { $0.count >= minimalPasswordLength }
.share(replay: 1)
let loginButtonValidate = Observable.combineLatest(usernameValidate, passwordValidate){ $0 && $1 }
.share(replay: 1)
usernameValidate
.bind(to: passwordTextField.rx.isEnabled)
//.disposed(by: disposeBag) //コメントアウトすることで比較処理が行われ、表示制御ができるようになります。
usernameValidate
.bind(to: userNameDescriptionLabel.rx.isHidden)
//.disposed(by: disposeBag)
passwordValidate
.bind(to: passwordDescriptionLabel.rx.isHidden)
.disposed(by: disposeBag)
loginButtonValidate
.bind(to: loginButton.rx.isEnabled)
//.disposed(by: disposeBag)
loginButton.rx.tap
.subscribe(onNext: { [weak self] _ in self?.showAlert() })
//.disposed(by: disposeBag)
}
func showAlert() {
let alertView = UIAlertView(
title: "RxExample",
message: "This is wonderful",
delegate: nil,
cancelButtonTitle: "OK"
)
alertView.show()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}