gpt4 book ai didi

objective-c - NSTableCellView 没有获得第一个焦点

转载 作者:行者123 更新时间:2023-11-30 10:02:24 25 4
gpt4 key购买 nike

我确实正在尝试解决这个特定问题。已经很久了。

我有一个 Mac 应用程序,它完全位于状态栏中。每当我通过单击状态栏图标打开应用程序时,弹出窗口都会打开 contentViewControllercontentViewController 有一个 tableView 和多个 tableView 单元格,它们是 NSTableCellView 的子类。单元格有一个按钮,我使用 NSTableViewCell 子类中的 mouseEnteredmouseExited 事件隐藏和取消隐藏该按钮。每当我单击单元格时,它都会将我带到网络,因为在默认网络浏览器中打开 URL 也会关闭 popOver。当跟踪事件 mouseEntered 调用时,有一个 pointingHandCursor 被激活。当在NSTableCellView子类中调用跟踪事件mouseExited时,它也会更改为默认的arrowCursor

好的。每当我打开应用程序时,它都会正确显示 pointingHandCursor 因为事件被调用并且光标被更改。现在,我单击该单元格,该单元格在网络浏览器中打开了链接,并且 popOver 被关闭。现在,通过单击状态栏图标再次打开应用程序。现在最糟糕的事情发生了,我可以在 tableView 中滚动鼠标,但同时我可以看到光标没有更改为 pointingHandCursor。

我尝试在任何地方调用 acceptFirstMouse 事件和 becomeFirstResponder 。到处都是,在 contentViewControllers View 的子类中,在 NSTableCellView 的子类中,在 View 窗口中......基本上无处不在。这对我没有帮助。

我还尝试添加全局鼠标监视器并监听mouseMoved事件,在此事件上我尝试设置becomeFirstRespondercontentViewControllers View 中接受FirstMouseMove,这不起作用。

然后我尝试在 NSTableCellView 的子类中再次调用相同的监视器并执行相同的操作,但这也不起作用。

基本上这些都没有给我带来预期的行为。我想实现这个目标。

请帮帮我。如果您想要一个有关其工作原理的示例。按照这个,

下载产品搜索应用程序,打开它,点击任何帖子,它将在网络浏览器中加载该帖子,回来,打开应用程序,滚动,您可以看到pointingHandCursor。但就我而言,打开 URL 后,指向 HandCursor 没有出现。 :(

最佳答案

Apple 的 NSTrackingArea 存在一个长期存在的错误。您必须验证当前鼠标位置是否仍然有效。

使用这个:

NSPoint cursorPt = [self convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:NULL];

不是这个:

[self convertPointFromBase:[ev locationInWindow]];

我在鼠标跟踪 UI 中使用类似于以下的代码。

- (void)resetCursorRects
{
[self adjustTrackingArea];
}

- (void) adjustTrackingArea
{
if ( trackingArea )
{
[self removeTrackingArea:trackingArea];
[trackingArea release];
}

// determine the tracking options
NSTrackingAreaOptions trackingOptions = NSTrackingEnabledDuringMouseDrag | NSTrackingMouseMoved |
NSTrackingMouseEnteredAndExited |
//NSTrackingActiveInActiveApp | NSTrackingActiveInKeyWindow | NSTrackingActiveWhenFirstResponder |
NSTrackingActiveAlways | NSTrackingAssumeInside | NSTrackingInVisibleRect;
NSRect theRect = [self visibleRect];
trackingArea = [[NSTrackingArea alloc]
initWithRect: theRect
options: trackingOptions
owner: self
userInfo: nil];
[self addTrackingArea:trackingArea];

// DOESN'T work on any OS version up to 10.10 self addToolTipRect:r owner:self userData:nil];

[controller mouseMoved:[NSApp currentEvent]]; // tracking area changes imply mouseMoved in its scroll view (virtually)
// IMHO a bug that apple doesn't call mouseMoved here.
}

- (void) mouseDown:(NSEvent*)evt { [controller mouseDown:evt]; }
- (void)mouseMoved:(NSEvent *)theEvent
{
[controller mouseMoved:theEvent];
if ( [theEvent type] == NSMouseMoved )
[super mouseMoved:theEvent];
}

- (void)mouseEntered:(NSEvent *)theEvent
{
// make sure current mouse cursor location remains under the mouse cursor
NSPoint cursorPt = [self convertPoint:[[self window] mouseLocationOutsideOfEventStream] fromView:NULL];

// apple bug!!!
//NSPoint cursorPt2 = [self convertPointFromBase:[ev locationInWindow]];
//if ( cursorPt.x != cursorPt2.x )
// NSLog( @"hello old cursorPt" );
NSRect r = [self frame];
if ( cursorPt.x > NSMaxX( r ) || cursorPt.x < 0 )
{
[self mouseExited:theEvent];
return;
}

[self mouseMoved:(NSEvent *)theEvent];
[super mouseEntered:theEvent];
}

- (void)mouseExited:(NSEvent *)theEvent
{
if ( controller.mouseHoverKey )
{
controller.mouseHoverKey = nil;
[self setNeedsDisplay:YES];
}
// if ( mouseHoverRow >= 0 && mouseHoverRow < [self numberOfRows] )
// [self setNeedsDisplayInRect:[self rectOfRow:mouseHoverRow]];
// mouseHoverRow = mouseHoverColumn = -1;
//if ( [[self delegate] conformsToProtocol:@protocol(MouseHoverProtocol)] )
// [(id<MouseHoverProtocol>)[self delegate] resetMouseHoverInfo:self];
//if ( [theEvent type] == NSMouseExited )
// [[NSCursor arrowCursor] set];
[super mouseExited: theEvent];
}

关于objective-c - NSTableCellView 没有获得第一个焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37731966/

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