我相信有一个简单的答案,但我对编程很不熟悉,并且在这里和我能找到的几个撤消教程上进行了广泛的搜索。
我有两个按钮和一个带有数字的UITextField。这些按钮分别将文本字段中的数字向上或向下递增 1。我还有几组这两个按钮和一个文本字段,每个按钮代表不同的东西。然后我有撤消和重做按钮,可以撤消按按钮引起的对文本字段的更改。这一切都很好用。
因此,现在我正在尝试添加撤消更改的功能,方法是直接使用数字键盘编辑文本字段,以便它进入相同的撤消堆栈,并且可以从相同的撤消和重做按钮撤消和重做。
下面是控制按钮按下的撤消和重做的代码片段。然后,就像我说的,我还有几组这些都进入同一个撤消堆栈。谢谢。
UITextField
@IBOutlet weak var Money: UITextField!
"撤消"和"重做"按钮
@IBAction func Undo(_ sender: UIButton)
{
undoManager?.undo()
}
@IBAction func Redo(_ sender: UIButton)
{
undoManager?.redo()
}
向上一个和向下一个按钮
@IBAction func MonDown(_ sender: UIButton)
{
subtractOneMon(Mon: Money)
}
@IBAction func MonUp(_ sender: UIButton)
{
addOneMon(Mon: Money)
}
注册撤消/重做函数
func subtractOneMon(Mon: UITextField)
{
undoManager?.registerUndo(withTarget: self, handler:
{(targetSelf) in
targetSelf.addOneMon(Mon: self.Money)
})
let Mon = Double(Money.text!)
let NewMon = Double(Mon! - 1)
Money.text = Int(NewMon).description
}
func addOneMon(Mon: UITextField)
{
undoManager?.registerUndo(withTarget: self, handler:
{(targetSelf) in
targetSelf.subtractOneMon(Mon: self.Money)
})
let Mon = Double(Money.text!) ?? 0
let NewMon = Double(Mon + 1)
Money.text = Int(NewMon).description
}
您可能希望为文本字段添加"正在编辑更改"的 IBAction。 每次更改字段的任何内容时都会调用此函数。
您希望将文本字段的先前值存储在某处。 在"编辑已更改"IBAction中,您将使用以前的值在undoManager中注册撤消操作,然后使用当前值更新以前的值。
附言处理程序的实现方式存在潜在的内存泄漏:当前它们持有对 UIViewController 的强引用。考虑在捕获列表中添加[弱自我]。查看 John Sundell 的内存管理文章以了解更多信息。