My project has a window with NSButton and NSView (which is a container for other views). Clicking on the button changes the container view as follows:
[containerView replaceSubview:displayedSubview with:nextView]
The first subview added to the containerView has a View Based TableView populated (using bindings) with an object of the NSTableCellView subclass.
This subclass of NSTableCellView has a tracking area that allows me to show / hide the button when the mouse enters / exits a cell.
The mouseEntered: and mouseExited: methods respectively show and hide _buttonInsideTableCellView using the setAlphaValue: method.
The tracking area is created in the init method as follows:
NSTrackingAreaOptions options = NSTrackingMouseEnteredAndExited|NSTrackingActiveInActiveApp; _trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds] options:options owner:self userInfo:nil];
The updateTrackingAreas method is simple:
- (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]; }
Problem
When the program starts, everything works as expected: if the mouse is above the cell, its button is displayed.
But after I changed the subview of the containerView to nextView and returned to the first view, the updateTrackingAreas method starts to be called many times (2 or more) when replacing the view, when the application becomes active (???), when the mouse enters or leaves tracking (? ??).
Call stack
Here is the call stack if I set a breakpoint in 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 ()