我有问题。鉴于我有一个 UITextField 一个按钮来删除文本字段的内容。
所以这可以按预期工作:
- 用键盘输入文字
- 点击删除按钮
- 用三个手指点击并从上下文菜单中选择撤消
- 文字再次出现
现在使用听写时事情开始变得很奇怪:
- 点击听写按钮
- 说出一些单词,以便它们出现在文本字段中
- 点击删除按钮
- 用三个手指点击并从上下文菜单中选择撤消
- 应用程序崩溃
崩溃是Terminating app due to uncaught exception 'NSRangeException', reason: 'NSMutableRLEArray replaceObjectsInRange:withObject:length:: Out of bounds'
因此,听写中的文本似乎并未出现在可能的撤消列表中。有没有人知道如何解决这个问题?到目前为止我尝试了什么:
- 使用基本代码清理应用程序以进行验证(请参阅本文末尾的代码)
- 创建 UITextField 的子类以
func dictationRecordingDidEnd()
使用文本覆盖和注册新的撤消 - 挠了挠我的头,想知道为什么
我很乐意在这里找到解决方案!
测试应用的代码示例:
import UIKit
class ViewController: UIViewController {
let textField = UITextField(frame: CGRect(x: 50, y: 50, width: 200, height: 44))
override func viewDidLoad() {
super.viewDidLoad()
textField.layer.borderColor = UIColor.black.cgColor
textField.layer.borderWidth = 1
view.addSubview(textField)
let deletebutton = UIButton(type: .custom)
deletebutton.frame = CGRect(x: 50, y: 100, width: 100, height: 50)
deletebutton.addTarget(self, action: #selector(deleteText(_:)), for: .touchUpInside)
deletebutton.setTitle("delete", for: .normal)
deletebutton.setTitleColor(.black, for: .normal)
view.addSubview(deletebutton)
}
@objc func deleteText(_ sender: UIButton) {
textField.text = nil
}
}
更新 1
我现在通过设置将清除按钮添加到文本字段textField.clearButtonMode = .whileEditing
,这可以按预期工作。所以主要问题是:内置清除按钮与自定义按钮有什么不同?是否触发了一些通知?还有什么魔法?请赐教!
更新 2
执行此操作时应用程序也会崩溃:
- 规定某事
- 使用不同的文本替换文本
textField.text = "Something"
- 三指点击并选择撤消