一个计算属性返回UITextField/UITextView未标记的text

467 阅读1分钟

直接上代码

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)