gpt4 book ai didi

swift - 我的代码在 textViewDidChangeSelection 中插入两个字符而不是一个

转载 作者:行者123 更新时间:2023-11-30 10:39:07 25 4
gpt4 key购买 nike

我有一个 textView,如果我选择一个字符并且该字符是一个投票箱 (\u{2610}),则代码应将投票箱替换为带有 x 字符 (\u{2612}) 的投票箱。

问题是代码插入了两个带有 x 字符 (\u{2612}) 的投票箱,而不是一个。

我正在使用 textViewDidChangeSelection 方法进行替换。我已经包含了下面的代码。

知道为什么要插入 2 个字符而不是 1 个吗?该方法是否被无意中调用了自身?

大量调试显示 ViewDidChange 方法似乎运行了几次。

func textViewDidChangeSelection(_ textView: UITextView) {
//make sure there's a range
if let range = textView.selectedTextRange {
//get and print cursor pos for debugging
let cursorPos = textView.offset(from: textView.beginningOfDocument, to: range.start)
print("cursor position on ViewDidChangeSelection:", "\(cursorPos)")

// grab one char to right of selection to check for ballot
if let newPosition = textView.position(from: range.start, offset: +1) {
if let startPosition = textView.position(from: range.start, offset: 0) {
let range2 = textView.textRange(from: startPosition , to: newPosition)
let selectedText2 = textView.text(in: range2!)
print("selected text is:", "\(selectedText2!)")

if selectedText2 == "\u{2610}" {
//select the ballot symbol and replace
textView.selectedTextRange = textView.textRange(from: startPosition, to: newPosition)
textView.insertText("\u{2612}")
}
}
}
}
}

结果应该是字符 u{2610} 应该被替换为 u{2612} 一次。感谢您的浏览。

最佳答案

发生这种情况是因为 textView.selectedTextRange 也会触发 textViewDidChangeSelection(_ textView: UITextView) 事件,因此该方法被调用两次。

如果你只需要改变一个字符,你可以这样替换:

if selectedText2 == "\u{2610}" {
//select the ballot symbol and replace
let range = textView.textRange(from: startPosition, to: newPosition)
textView.replace(range!, withText:"\u{2612}")
}

如果您需要更改所有出现的情况,可以像这样进行替换:

if selectedText2 == "\u{2610}" {
//select the ballot symbol and replace
textView.text = textView.text.replacingOccurrences(of: "\u{2610}", with: "\u{2612}")
}

关于swift - 我的代码在 textViewDidChangeSelection 中插入两个字符而不是一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57259007/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com