今回はRxSwiftというライブラリを使って実装します。
非同期処理がシンプルに書けるものらしいですがまだまだ自分は勉強し始めなので理解できている部分が少ないです(泣)
Contents 非表示
プロジェクト作成 & 下準備
Storyboard
RxSwiftのインストール
pod 'RxSwift', '6.5.0'
pod 'RxCocoa', '6.5.0'
コードの記述
import UIKit
import RxSwift
import RxCocoa
class SimpleRxTapViewController: UIViewController {
@IBOutlet private weak var nameField: UITextField!
@IBOutlet private weak var nameLabel: UILabel!
@IBOutlet private weak var addressField: UITextField!
@IBOutlet private weak var addressLabel: UILabel!
//名前フィールドの上限文字数
private let maxNameFieldSize = 10
//住所フィールドの上限文字数
private let maxAddressFieldSize = 50
let limitText: (Int) -> String = {
return "あと\($0)文字"
}
override func viewDidLoad() {
super.viewDidLoad()
setupTextField()
}
//TextFieldの初期設定
private func setupTextField() {
nameField.addTarget(self, action: #selector(nameFieldEditingChanged(sender:)), for: .editingChanged)
addressField.addTarget(self, action: #selector(addressFieldEditingChanged(sender:)), for: .editingChanged)
}
//"あと何文字"の部分をリアルタイムで検知して値を変更する
@objc func nameFieldEditingChanged(sender: UITextField) {
guard let changeText = sender.text else {return}
let limitCount = maxNameFieldSize - changeText.count
if limitCount < 1 {
nameField.isEnabled = false
}
nameField.isEnabled = true
nameLabel.text = limitText(limitCount)
}
//同上
@objc func addressFieldEditingChanged(sender: UITextField) {
guard let changeText = sender.text else {return}
let limitCount = maxAddressFieldSize - changeText.count
if limitCount < 1 {
addressField.isEnabled = false
}
addressField.isEnabled = true
addressLabel.text = limitText(limitCount)
}
}
ビルドをして確認
これは確かに便利だなと感じました、コードもスッキリとしていて読みやすいです。
まとめ
今回は以上です、非同期処理系はまだまだ勉強中なので備忘録としてどんどん新しく学んだことを記事にしていこうと思います。
◎今日の格言
ー Nelson Mandela
Nelson
Education is the most powerful weapon which you can use to change the world.
(教育こそが世界を変えられる一番強力な武器である)