创建具有适当撤消管理的持续更新的自定义控件
|
我将一个自定义的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)。
谢谢!
没有找到相关结果
已邀请:
1 个回复
量华
和
吗? 附言如果您对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