直接上代码
import UIKit
extension UITextInput {
/// Return text with marked text trimmed. Used specifically when you type in chinese with Pinyin.
var unmarkedText: String? {
guard let inputRange = textRange(from: beginningOfDocument, to: endOfDocument) else {
return .none
}
guard var inputText = text(in: inputRange) else {
return .none
}
guard let markedRange = markedTextRange else {
return inputText
}
let location = offset(from: beginningOfDocument, to: markedRange.start)
let lenghth = offset(from: markedRange.start, to: markedRange.end)
let from = inputText.index(inputText.startIndex, offsetBy: location)
let to = inputText.index(from, offsetBy: lenghth)
inputText.removeSubrange(from ..< to)
return inputText
}
}
因为UITextField/UITextView都实现了UITextInput协议,所以直接用两个类的实例获取这个属性即可。 这样在输入拼音时就只会返回不带拼音的字符串了。
配上RxCocoa简直所向披靡
searchTextField.rx
.controlProperty(editingEvents: .editingChanged, getter: \.unmarkedText) { $0.text = $1 }
.orEmpty
.changed
.distinctUntilChanged()
.debounce(.seconds(1), scheduler: SerialDispatchQueueScheduler(qos: .default))
.bind(to: searchBinder)
.disposed(by: disposeBag)