gpt4 book ai didi

macos - 如何中止 NSStepper 自动重复?

转载 作者:行者123 更新时间:2023-12-03 17:19:45 27 4
gpt4 key购买 nike

我有一个自动重复的 NSStepper,当我收到特定的 NSNotification 时,我想停止跟踪。

一个想法是从接收通知的方法发送[_stepper setAutorepeat: NO]。那是行不通的。我认为步进器仅在跟踪开始时检查自动重复标志。

然后我想我可以子类化 NSStepperCell,并使用 -[NSCell continueTracking:at:inView:] 的覆盖来中止跟踪。但是,显然,当步进器在鼠标不移动的情况下自动重复时,不会调用该方法。

我需要完全重写trackMouse:inRect:ofView:untilMouseUp:吗?我想,当鼠标移入或移出时,我必须处理步进器的突出显示部分,而且我没有看到任何公共(public) API 来找出突出显示的部分。

最佳答案

我最终发布了一个鼠标松开事件。我将 NSStepperCell 子类化,作为观察通知和发布事件的便捷位置。

@interface AbortableStepperCell : NSStepperCell
{
BOOL _isTracking;
BOOL _isObserverInstalled;
}


@implementation AbortableStepperCell

- (void) dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver: self];

[super dealloc];
}

- (BOOL)startTrackingAt: (NSPoint) startPoint
inView: (NSView *) controlView
{
_isTracking = YES;

if ( ! _isObserverInstalled )
{
[[NSNotificationCenter defaultCenter]
addObserver: self
selector: @selector(abortTracking:)
name: @"AbortMouseTracking"
object: nil];

_isObserverInstalled = YES;
}

return [super startTrackingAt: startPoint inView: controlView];
}

- (void) abortTracking: (NSNotification*) note
{
if (_isTracking)
{
NSWindow* myWindow = self.controlView.window;
NSGraphicsContext* gc =
[NSGraphicsContext graphicsContextWithWindow: myWindow];

NSEvent* upEvent = [NSEvent
mouseEventWithType: NSLeftMouseUp
location: NSZeroPoint
modifierFlags: 0
timestamp: 0.0
windowNumber: myWindow.windowNumber
context: gc
eventNumber: 0
clickCount: 1
pressure: 0.0f ];

if (upEvent)
{
[NSApp postEvent: upEvent atStart: YES];
}
}
}

- (void)stopTracking:(NSPoint)lastPoint
at:(NSPoint)stopPoint
inView:(NSView *)controlView
mouseIsUp:(BOOL)flag
{
_isTracking = NO;

[super stopTracking: lastPoint
at: stopPoint
inView: controlView
mouseIsUp: flag];
}

@end

关于macos - 如何中止 NSStepper 自动重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35785942/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com