标签: uitextinput

UITextInputMode.activeInputModes()在Swift 2中崩溃

我想在Swift 2中获得UITextInputMode但UITextInputMode.activeInputModes()崩溃了.

    let x = UITextInputMode.activeInputModes() // crash here

    for t in x {
        print(t)
    }
Run Code Online (Sandbox Code Playgroud)

ios uitextinput swift swift2

4
推荐指数
2
解决办法
739
查看次数

用于UITextField和UITextView的UITextInput协议用于管理崩溃中的选择结果

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+.]

uitextfield uitextview ios uitextinput

3
推荐指数
1
解决办法
4431
查看次数

UITextView观察文本变化

我想监听 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 会将第一个空格替换为点,并且显然不会通知你此方法中的此操作以及许多其他问题。

uitextview uikit uitextviewdelegate ios uitextinput

2
推荐指数
1
解决办法
1300
查看次数

如何以编程方式关闭UITextView中的自动更正弹出窗口?

我正在自己做一些自定义自动完成的东西insertText:,但是如果有一个自动更正的建议可见,则视图进入一个奇怪的状态.

如果我使用[textView unmarkText]它,它会解散自动更正弹出的东西 - 但它接受自动更正(这是坏的).有没有办法以编程方式拒绝自动更正建议?

我当前的"解决方案"有效,但它很粗糙,而且我没有理由认为它将来会继续发挥作用.有一个更好的方法吗?

- (void)dismissAutocorrectSuggestionForTextView:(UITextView *)textView {
    NSRange range = textView.selectedRange;
    textView.text = textView.text;
    textView.selectedRange = range;
}
Run Code Online (Sandbox Code Playgroud)

cocoa-touch uitextview ios uitextinput

0
推荐指数
1
解决办法
2899
查看次数

将当前活动的键盘语言作为NSLocale获取

我已经找到了很多方法,但没有可行的解决方案.这是我尝试过但没有用的东西.

(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?

ios uitextinput swift

0
推荐指数
1
解决办法
1708
查看次数