创建具有适当撤消管理的持续更新的自定义控件

| 我将一个自定义的NSView放在一起,该NSView通过绑定处理两个值。我正在传播汤姆·达林(Tom Dalling)在问题“您可以手动实现可可绑定吗?”中概述的更新时的值。这一切都很好。 为了使控件连续更新,我以“ 0”方法更新并传播了这些值。再次,这可以正常工作,但是将中间步骤注册到了我不想要的NSUndoManager中。因此,我尝试在
-mouseDown
中发行
disableUndoRegistration
,然后在
mouseUp
中发行
enableUndoRegistration
。我自然会更新并再次传播结果。 根本没有注册撤消操作,我意识到这是因为如果值不变,我的set函数就不会注册撤消操作:
- (void)setX:(double)newX {
    if (newX != x) {
        [[undoManager prepareWithInvocationTarget:self] setX:x];
        [self willChangeValueForKey:@\"x\"];
        x = newX;
        [self didChangeValueForKey:@\"x\"];
    }
}
由于
-mouseDragged
已经传播了该值,因此在
-mouseUp
中再次发送该值时它没有改变,因此从未记录撤消。我当然希望它撤消到初始值
-mouseDown
之前的位置,所以说我这样做是通过将值存储在控件中,然后在发送新值之前在in7ѭ中再次发送该值。当然,这仍然存在一个问题,我可以看到它又回到了原来的价值。 我可以通过检查是否启用了撤消管理器并跟踪旧值,以“ 10”方法解决此问题。但是,我应该能够从控件内完成此操作,因为有些控件具有这种确切的行为(例如将NSSlider设置为continuous)。 谢谢!     
已邀请:
您不能只使用
beginUndoGrouping
endUndoGrouping
吗? 附言如果您对Cocoa类在内部的工作方式感到好奇,那么有时检查一下GNUstep实现可能会有所帮助(NSUndoManager在GNUstep Base中,AppKit类(如NSSliderCell在GNUstep GUI中)): http://wwwmain.gnustep.org/resources/downloads.php?site=http%3A%2F%2Fftpmain.gnustep.org%2Fpub%2Fgnustep%2F#core     

要回复问题请先登录注册