我想在Swift 2中获得UITextInputMode但UITextInputMode.activeInputModes()崩溃了.
let x = UITextInputMode.activeInputModes() // crash here
for t in x {
print(t)
}
Run Code Online (Sandbox Code Playgroud) UITextField和UITextView都采用UITextInput协议.UITextView的selectedRange属性返回NSRange,其中UITextField没有任何选择属性/方法.我想使用一个例程来管理UITextField或UITextView中的插入.
所以我做了以下事情:
id<UITextInput> textInput = nil;
if ([self.aTextView isFirstResponder]) {
textInput = self.aTextView;
} else if ([self.aTextField isFirstResponder]) {
textInput = self.aTextField;
}
if (textInput != nil) {
UITextRange * selectedRange = textInput.selectedTextRange;
// ...
}
Run Code Online (Sandbox Code Playgroud)
只是在selectedTextRange属性上立即崩溃"无法识别的选择器发送到实例".
我究竟做错了什么?
[编辑:似乎在iOS 5中工作,但在iOS 4中的设备上崩溃.这是iOS 5中的变化吗?文件说协议是3.2+.]
我想监听 UITextView 中的每个文本更改。设置非常简单。
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(
self,
selector: #selector(textViewDidChangeWithNotification(_:)),
name: UITextView.textDidChangeNotification,
object: nil
)
}
@objc private func textViewDidChangeWithNotification(_ notification: Notification) {
print("Text: \(String(describing: inputTextView.text))")
}
Run Code Online (Sandbox Code Playgroud)
在大多数情况下它工作正常,但后来我发现了一些 UITextInput 的黑盒魔法。
第 1 步:输入“我”。我们可以在输出中看到“I”。
第二步:重要的一步。双击字段选择所有文本。
第 3 步:从单词建议中选择“如果”。
并且调试器输出中没有“If”。另一方面,如果插入符号位于“I”单词的末尾,并且我们选择“If”,则输出结果是正确的。
有什么方法可以观察所有文本变化吗?
我可以使用以下方式获取文本:
func textViewDidEndEditing(_ textView: UITextView)
Run Code Online (Sandbox Code Playgroud)
但我需要实时观察所有的变化。我总是看到的另一个选择是使用:
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool
Run Code Online (Sandbox Code Playgroud)
但这种方法对于观察变化来说是一个不好的做法。如果你重复输入两个空格,iOS 会将第一个空格替换为点,并且显然不会通知你此方法中的此操作以及许多其他问题。
我正在自己做一些自定义自动完成的东西insertText:,但是如果有一个自动更正的建议可见,则视图进入一个奇怪的状态.
如果我使用[textView unmarkText]它,它会解散自动更正弹出的东西 - 但它接受自动更正(这是坏的).有没有办法以编程方式拒绝自动更正建议?
我当前的"解决方案"有效,但它很粗糙,而且我没有理由认为它将来会继续发挥作用.有一个更好的方法吗?
- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
NSRange range = textView.selectedRange;
textView.text = textView.text;
textView.selectedRange = range;
}
Run Code Online (Sandbox Code Playgroud) 我已经找到了很多方法,但没有可行的解决方案.这是我尝试过但没有用的东西.
(1)简单地调用primaryLanguage()
UITextInputMode().primaryLanguage
Run Code Online (Sandbox Code Playgroud)
→总是返回nil: - /
(2)订阅UITextInputCurrentInputModeDidChangeNotification通知
override func viewDidLoad() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "changeInputMode:", name: UITextInputCurrentInputModeDidChangeNotification, object: nil)
}
func changeInputMode(sender : NSNotification) {
...?!
}
Run Code Online (Sandbox Code Playgroud)
通知已被触发,但我不清楚如何从通知中提取当前语言信息.
(3)使用activeInputModes()
let localeIdentifier = UITextInputMode.activeInputModes().first as? UITextInputMode
var locale:NSLocale = NSLocale(localeIdentifier: localeIdentifier.primaryLanguage!)
println("Input Mode Language \(localeIdentifier.primaryLanguage!)")
Run Code Online (Sandbox Code Playgroud)
这始终提供所有可用键盘的相同阵列,没有关于实际活动键盘的信息.
如何获取当前活动键盘的NSLocale?