- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当值是引用类型时,我无法理解 NSUndoManager 如何捕获值。每当尝试使用 undoManager 时,这些值都不会撤消。
注意:我需要支持 macOS 10.10,我使用的是 Swift 3 和 XCode 8
这里我保存了ID号的状态,将它们全部重置为-1,然后尝试撤销。结果还是都是-1。
import Cocoa
class Person: NSObject {
var id: ID
init(withIDNumber idNumber: Int) {
self.id = ID(idNumber)
}
}
class ID: NSObject {
var number: Int
init(_ number: Int) {
self.number = number
}
}
ViewController... {
@IBAction func setIDsToNegative1(_ sender: NSButton) {
var savedIDs: [ID] = []
for person in people {
savedIDs.append(person.id)
}
undoManager?.registerUndo(withTarget: self, selector:#selector(undo(savedIDs:)), object: savedIDs)
for person in people {
person.id.number = -1
}
}
func undo(savedIDs: [ID]) {
for id in savedIDs {
print(id.number)
}
//Prints -1, -1, -1
}
}
为了向自己证明捕获值是个问题,我没有保存 ID 对象本身,而是存储了它们包含的 Int 值。它工作得很好,因为 Int 是值类型。
然后我阅读了更多关于闭包捕获的内容并尝试了这个。
undoManager?.registerUndo(withTarget: self, handler: { [saved = savedIDs]
(self) -> () in
self.undo(savedIDs: saved)
})
同样的问题,仍然是-1。
最佳答案
NSUndoManager
并不是真正关于捕获旧的值,而是关于捕获操作恢复原始值值(value)观。
您只捕获对 ID
的引用。所以 savedIDs
中的元素指向与 people
元素的 id
属性相同的对象,即当你改变一个时,你也换一个。
您需要做的是手动保存 ID
和您想要将它们重置为的值,如下所示:
let savedPairs = people.map { (id: $0.id, originalValue: $0.id.number) }
这确保 id
的 number
值本身保存在某处,而不仅仅是指向 id
的指针。
然后您可以注册一个操作,使用您手动捕获的值执行撤消操作,如下所示:
undoManager.registerUndo(withTarget: self) {
savedPairs.forEach { $0.id.number = $0.originalValue }
}
关于swift - NSUndoManager:可以捕获引用类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41575694/
我正在尝试创建一个 iPhone 应用程序,用户可以在其中添加条目。当他按下新条目时,会弹出一个框,询问他一些信息。然后他可以按“取消”或“保存”来放弃数据或将其保存到磁盘。 为了保存,我使用了 Co
如何在使用 prepareWithInitationTarget 时设置与设置撤消操作相同的特定重做操作 使用我的方法,重做不起作用(撤消有效) - (void)removeSmth:(Smth *)
以下是启用撤消功能的代码,摘自 Aaron Hillegas 所著的《cocoaprogramming for OS X》一书: -(void)removeObjectFromEmployeesAtI
我正在编写一个基于非NSDocument的应用程序,其风格类似于AddressBook.app。它有一个位于 MainMenu.nib 中的窗口。 目前,我正在努力将 NSUndoManager 与此
我有一个复杂的情况,我有一个 View Controller 和几个 subview Controller 。 情况A:当我更改 subview Controller 时,我将更改记录在NSUndoM
当值是引用类型时,我无法理解 NSUndoManager 如何捕获值。每当尝试使用 undoManager 时,这些值都不会撤消。 注意:我需要支持 macOS 10.10,我使用的是 Swift 3
我有一个应用程序,我想在每次更改之前保存项目的当前状态,以便撤消和重做能够在这些状态中来回切换。当我更改保存位置的代码时: if(!undoManager){ undoManager = [[
我正在尝试将撤消/重做功能集成到 UITextView(我正在构建一个 LateX 编辑器)中,但没有成功,老实说,我对这个论点真的很困惑。我不明白这两个操作涉及的步骤,我的意思是我需要两种方法 删除
核心数据支持开箱即用的撤消/重做。但它的表现出乎意料。 为了使我的用户界面与我的模型保持同步,我发送了通知。我的用户界面收到通知消息并更新受影响的 View 。 @objc(Entity) class
我有一个 NSView 对象,它接收 mouseDragged 事件,该事件会更改在其各自 View 中绘制的对象的位置。然后,在我的 NSViewController 类中,它检索该新位置并将该新值
我想了解/复制NSUndoManger的“按运行循环传递/循环分组”功能:当在同一运行循环周期中多次调用时, NSUndoManager 可以将对 registerUndo() 的多次调用分组为单个“
我注意到如果我说类似的话 [self.undoManager setActionName: @"X & Y"]; 然后生成的菜单项看起来像“撤消 X Y”(X 和 Y 之间有一个双倍空格)。 (在 M
我正在开发一个核心数据应用程序,该应用程序具有相当大的托管对象层次结构,类似于树。 当创建一个基础对象时,它会创建一些子对象,这些子对象又创建自己的子对象,依此类推。这些子对象中的每一个都可以使用 N
我有一个与部门具有多对一关系的托管对象 Employee。因此,一个员工可以在一个部门中,但部门可以包含多个员工。 我使用撤消管理器来注册某些员工的删除。之后我关闭撤消注册我删除部门。部门删除会删除所
我有一个应用程序,它允许用户上下移动 UIView,使一个 View 看起来可以在另一个 View 之上。通过使用 exchangeSubviewAtIndex 方法更改父 View 中 UIView
在我的应用中,用户能够在对象之间快速来回切换并编辑这些对象上的文本。 当他们按下“撤消”时,我想调出相关对象,以便他们可以看到他们正在执行的撤消。 这些对象是 NSManagedObject 子类的实
我不仅需要将更改保存到本地核心数据中,还需要保存到服务器上。 我担心的是,就我而言,用户可以在短时间内进行大量交互。交互之间没有足够的时间接收服务器返回的成功消息。因此,要么我锁定 GUI,直到下一条
NSUndoManager 将发生在同一个运行循环中的调用组合在一起。 我想加载一个包含撤消历史记录的文档。 因此,我创建了一个文档并一个一个地应用调用,但是这些调用都非常快速地添加,导致一次撤消。
我有一些简短的 iOS Objective-C 示例代码(从一个较大的项目中简化而来)导致 NSUndoManager 崩溃,我无法解释。 即,当一个对象仅由 NSUndoManager 持有时 de
我正在尝试在使用 GLKit 的 iOS 应用程序中支持撤消/重做. 当我尝试以下操作时: GLKVector3 currentTranslation = _panningObject.transla
我是一名优秀的程序员,十分优秀!