iOS
Swift
RxSwift

RxSwift(RxCocoa)でUITextFieldに文字数制限を実装する

調べるとNSNotificationなどを使って実現することが多いようですが、RxSwiftを導入しているアプリケーションを作っているのでRxSwift(RxCocoa)を使ってやってみます。

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController {

    @IBOutlet weak var codeTextField: UITextField!

    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        let codeLengthLimit = 6

        codeTextField.rx.text.subscribe(
            onNext: { [weak self] text in
                if let txt = text {
                    if txt.count >= codeLengthLimit {
                        let start = txt.startIndex
                        let end = txt.index(start, offsetBy: codeLengthLimit)
                        let substr = txt.substring(with: start..<end)
                        self?.codeTextField.text = substr
                    }
                }
        }).addDisposableTo(disposeBag)

指定された長さ(上記でいうとcodeLengthLimit)を超えた場合は指定された長さの文字分だけ切り取ってUITextFieldに上書きしてしまうという感じで実現しました。
正直もうちょっとマシなやり方ある気がするのですが、とりあえずこれで実現しました。