Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 多次调用updateTrackingAreas方法_Cocoa - Fatal编程技术网

Cocoa 多次调用updateTrackingAreas方法

Cocoa 多次调用updateTrackingAreas方法,cocoa,Cocoa,在我的项目中,有一个带有NSButton和NSView的窗口(它是其他视图的容器)。单击按钮可更改容器的子视图,如下所示: [containerView replaceSubview:displayedSubview with:nextView]; NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited|NSTrackingActiveInActiveApp; _trackingArea = [[NSTrackingAr

在我的项目中,有一个带有NSButtonNSView的窗口(它是其他视图的容器)。单击按钮可更改容器的子视图,如下所示:

[containerView replaceSubview:displayedSubview with:nextView];
NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited|NSTrackingActiveInActiveApp;
_trackingArea  = [[NSTrackingArea alloc] initWithRect:[self bounds] options:options owner:self userInfo:nil];
添加到containerView的第一个子视图使用NSTableCellView子类的对象填充了基于视图的TableView(使用绑定)

这个子类NSTableCellView有一个跟踪区域,当鼠标进入/离开单元格时,可以显示/隐藏按钮

方法鼠标输入:鼠标退出:分别使用setAlphaValue:方法显示和隐藏SideTableCellView中的按钮

跟踪区域在init方法中创建,如下所示:

[containerView replaceSubview:displayedSubview with:nextView];
NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited|NSTrackingActiveInActiveApp;
_trackingArea  = [[NSTrackingArea alloc] initWithRect:[self bounds] options:options owner:self userInfo:nil];
updateTrackingAreas方法很简单:

- (void)updateTrackingAreas
{
    [_buttonInsideTableCellView setAlphaValue:0.0];

    [self removeTrackingArea:_trackingArea];

    NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited|NSTrackingActiveInActiveApp;
    _trackingArea  = [[NSTrackingArea alloc] initWithRect:[self bounds] options:options owner:self userInfo:nil];

    [self addTrackingArea:_trackingArea];

    [super updateTrackingAreas];
}
问题 当程序启动时,一切都按预期进行:如果鼠标位于单元格上方,则会显示其按钮

但是,在我将containerView的子视图更改为nextView并返回到第一个视图之后,当替换子视图时,当应用程序处于活动状态时(?),当鼠标进入或离开trackingArea(?),就会开始多次调用updateTrackingAreas方法(2次或更多次)

调用堆栈 如果我在updateTrackingAreas中设置断点,则调用堆栈如下:

#0  0x0000000100019e33 in -[CustomTableCellView updateTrackingAreas]
#1  0x00007fff8a1b24e4 in -[NSView(NSInternal) _updateTrackingAreas] ()
#2  0x00007fff894740b6 in __NSArrayEnumerate ()
#3  0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#4  0x00007fff894740b6 in __NSArrayEnumerate ()
#5  0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#6  0x00007fff894740b6 in __NSArrayEnumerate ()
#7  0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#8  0x00007fff894740b6 in __NSArrayEnumerate ()
#9  0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#10 0x00007fff8a1b36bd in -[NSScrollView _updateTrackingAreas] ()
#11 0x00007fff894740b6 in __NSArrayEnumerate ()
#12 0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#13 0x00007fff894740b6 in __NSArrayEnumerate ()
#14 0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#15 0x00007fff894740b6 in __NSArrayEnumerate ()
#16 0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#17 0x00007fff894740b6 in __NSArrayEnumerate ()
#18 0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#19 0x00007fff894740b6 in __NSArrayEnumerate ()
#20 0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#21 0x00007fff894740b6 in __NSArrayEnumerate ()
#22 0x00007fff8a1b2960 in -[NSView(NSInternal) _updateTrackingAreas] ()
#23 0x00007fff8a1b237c in _handleInvalidCursorRectsNote ()
#24 0x00007fff8a6ac851 in __35-[NSWindow _postInvalidCursorRects]_block_invoke_02794 ()
#25 0x00007fff894420c7 in __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ ()
#26 0x00007fff89442031 in __CFRunLoopDoObservers ()
#27 0x00007fff8941d4a8 in __CFRunLoopRun ()
#28 0x00007fff8941cdd2 in CFRunLoopRunSpecific ()
#29 0x00007fff89a72774 in RunCurrentEventLoopInMode ()
#30 0x00007fff89a72454 in ReceiveNextEventCommon ()
#31 0x00007fff89a723a3 in BlockUntilNextEventMatchingListInMode ()
#32 0x00007fff8a0d7fa3 in _DPSNextEvent ()
#33 0x00007fff8a0d7862 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] ()
#34 0x00007fff8a0cec03 in -[NSApplication run] ()
#35 0x00007fff8a073656 in NSApplicationMain ()
#36 0x00000001000013a2 in main
#37 0x0000000100001374 in start ()

现在还不清楚这里有什么问题。updateTrackingAreas方法旨在当视图几何图形发生更改时,或当需要您重新计算跟踪区域时,AppKit多次调用。例如,在动画中,当边界随时间快速变化时,您的方法将在每次运行循环中快速连续地调用


仅供参考,更改任何视图的状态,或者在该方法中除了添加或删除跟踪区域之外,真正执行任何操作都可能不是一个好主意。这里您正在更改按钮的alpha状态。这可能最好放在其他地方。

为什么要使用updateTrackingAreas?如果您不更改表格单元格视图的边界,我认为您不需要这样做。表格视图(及其单元格)会随窗口调整大小。我不确定您看到的内容是否有任何错误。由于您的帖子中有很多问号,很难准确地说出何时调用更新,但我认为应该在视图出现时调用更新(表中每一可见行调用一次)当您滚动或调整大小时,会出现问号,因为奇怪的是,在这些情况下调用该方法。当视图关闭/打开屏幕时会调用该方法。。听起来很合理