ios - 如何获取 UITextView 中光标之前的字符?

标签 ios swift uitextview

假设我有以下 UITextView 对象:

var textView = UITextView()
textView.text = "Hello World!"

现在假设我不想让用户在编辑时删除“W”字符。我怎么知道哪个字符在光标之前(或被光标选中)?

我正在寻找可以像这样工作的东西:

if textView.characterBeforeCursor() != "W" {
   textView.deleteBackward()
}

或者...(当用户选择“W”字符时):

if textView.selectedTextContains("W") == false {
   textView.deleteBackward()
}

我应该使用什么方法来实现这个目标?

最佳答案

这是一个想法,没有经过全面测试,但似乎可行...只需捕获要操作的角色并阻止退格键(如果它是目标)...还有关于文本选择,如果选择包含完全没有目标,我们阻止新文本。

import UIKit

class ViewController: UIViewController, UITextViewDelegate {

    @IBOutlet weak var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.textView.delegate = self
        // Do any additional setup after loading the view, typically from a nib.
    }

    func characterBeforeCursor() -> String? {
        // get the cursor position
        if let cursorRange = textView.selectedTextRange {
            // get the position one character before the cursor start position
            if let newPosition = textView.position(from: cursorRange.start, offset: -1) {
                let range = textView.textRange(from: newPosition, to: cursorRange.start)
                return textView.text(in: range!)
            }
        }
        return nil
    }

    func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        if (characterBeforeCursor() == "W") {
            let char = text.cString(using: String.Encoding.utf8)!
            let isBackSpace = strcmp(char, "\\b")
            if (isBackSpace == -92) {
                return false
            }
            return true
        }
        else {
            if let range = textView.selectedTextRange {
                let selectedText = textView.text(in: range)
                if (selectedText!.contains("W")) {
                    return false
                }
            }
            return true
        }
    }
}

关于ios - 如何获取 UITextView 中光标之前的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52515117/

相关文章:

iphone - UIView 保存有关模型(业务对象)的信息有多糟糕

ios - 停止调用 cellForRowAtIndexPath

swift - 如何将闭包作为变量传递?

ios - UitableView 下移

iphone - 获取 UITextView 中某个单词的 X 和 Y 坐标

iphone - 如何在我的本地应用程序中集成 Skype 功能

ios - 几次打开后,无法打开 UIManagedDocument 文件似乎已损坏

ios - TextField 在按下完成时换行而不是关闭键盘 Xcode 10

ios - -[当我使用 UITraitCollection 变体时,UITextView setAttributedText :] stops working,

ios - 如何知道文字的走向?