Cocoa 如何确定NSTextFieldCell isHighlighted何时没有焦点?

Cocoa 如何确定NSTextFieldCell isHighlighted何时没有焦点?,cocoa,nstextfield,Cocoa,Nstextfield,我已经对一个NSTextFieldCell(在NSTableView中)进行了子类化,以便在选中一个单元格(即行)并且一切正常时绘制自定义前景色(例如isHighlighted为true) 问题是,当表格视图失去焦点时,我想用不同的颜色绘制选定的行,如何确定包含单元格的表格视图是否不是drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView中的第一个响应程序 我现在的代码是 - (void)drawWithFrame:(NSRect)

我已经对一个NSTextFieldCell(在NSTableView中)进行了子类化,以便在选中一个单元格(即行)并且一切正常时绘制自定义前景色(例如isHighlighted为true)

问题是,当表格视图失去焦点时,我想用不同的颜色绘制选定的行,如何确定包含单元格的表格视图是否不是drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView中的第一个响应程序

我现在的代码是

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
        NSColor* textColor = [self isHighlighted]
                 ? [NSColor alternateSelectedControlTextColor]
                 : [NSColor darkGrayColor];
}

我已经找到了一个使用第一响应者的解决方案,它很简单而且看起来很有效

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView*)controlView {
        NSColor* textColor;

        if ([self isHighlighted]) {
            textColor = [[controlView window] firstResponder] == controlView 
                     ? [NSColor alternateSelectedControlTextColor]
                     : [NSColor yellowColor];
        } else {
            textColor = [NSColor darkGrayColor];
        }

        // use textColor
        ...
        ...
        [super drawWithFrame:cellFrame inView:controlView];
    }

我发现最好的方法是使用编辑器,它不会让你处理响应者(因为有时候
controlView
的超级视图就是响应者或一些废话):

BOOL isEditing = [(NSTextField *)[self controlView] currentEditor] != nil;

这么简单

还有一件事,上面的代码非常完美,但是如果您有多个窗口 你需要检查你的窗口是否是关键的

        if (controlView && ([[controlView window] firstResponder] == controlView) && [[controlView window] isKeyWindow]) {
            [attributes setObject:[NSColor whiteColor] forKey:NSForegroundColorAttributeName];
        }

我也很想知道答案!我也发现了这一点,但当应用程序被停用时,它不会检查情况。真不敢相信没有更好的方法了。您只需要注册通知
nSapplicationIDResignActiveNotification
nSapplicationIDBecomeActiveNotification
,然后在表视图中调用
-setNeedsDisplay:
,使用您配置的方法来处理通知。我猜还需要注册windows是否处于活动和非活动状态?对于一个标准的细胞聚焦来说似乎有很多事情要做。AppKit中一定有更好的隐藏方式…或者是时候将其封装到组件/类别中了。实际上,
showsFirstResponder
是检查单元格是否高亮显示的更好方式,因为它也捕获了单击事件。这个问题很老了,我已经解决了,正如你所说的,谢谢,回答接受:)并检查窗口是否为键?还是没有必要<代码>&[self.window isKeyWindow]