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