如何用 RxSwift + UITextField 來控制中文字數,不被注音文干擾?

在 iOS 的系統中,要輸入中文看似簡單,但實際上都需要許多英文單字或是拆解而組成,舉例來說,如果你要打手機,可能會打「ㄕㄡㄐㄧ」,而在打字的途中,其實就算是文字的變化了,所以如果 UITextField 有數字限制,就變得很難控了。幸好 RxSwift 是一個很方便的好物,接下來我們來看如何利用 RxSwift + UITextField 來實現吧!

swift 1

如果使用 RxSwift,我們一樣可以去監聽。舉例來說,我們可以自訂一個 RxTextField 的元件。

public class RxTextField: UITextField {

    private(set) var m_TextChangeRelay = BehaviorRelay<String>(value: "")

    public override func awakeFromNib() {
        super.awakeFromNib()

        rx.controlEvent([.editingChanged])
                .asObservable()
                .subscribe(onNext: { [weak self] _ in
                     self?.textChanged()
                })
                .disposed(by: disposeBag)
    }
}

接下來,用 「markedTextRange」來判斷是不是已經輸入完成而且選完詞了,如果「markedTextRange」為空,表示已經選完了,其它函式就可以用訂閱的方式就可以取到值啦,是不是超方便的?


private func textChanged(){

    if markedTextRange != nil  {
        return
    }

    let newText = text
    if newText?.count ?? 0 > max_count {
        text = newText?[0..<max_count]
    }
    m_TextChangeRelay.accept(text ?? "")
}

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。