考虑到我似乎每天都涉及的所有复杂事情,这似乎是“我到底在做什么错,这似乎很简单?”场景!

我想对NSTextField进行子类化以更改背景颜色和文本颜色。为简单起见(以帮助以前从未继承过任何东西的人),这是我的(简化的)子类MyNSTextFieldSubclass的示例...

步骤1:

创建子类文件:

首先头文件

@interface MyTextFieldSubclass : NSTextField {
}

@end


和方法文件

@implementation MyTextFieldSubclass

-(NSColor *)backgroundColor {
    return [NSColor redColor];
}

-(NSColor *)textColor {
    return [NSColor yellowColor];
}

@end


第2步:

NSTextField拖到Interface Builder中的窗口中,在检查器中选择Identity选项卡,然后选择类MyTextFieldSubclass

第三步:

保存IB文件,构建并运行该应用程序

问题

当我运行构建时,文本字段不会反映颜色子类。但是,我知道正在调用该子类,因为如果添加以下方法,则将在文本更改时调用它。

-(void)textDidChange:(NSNotification *)notification {
    NSLog(@"My text changed");
}


那么,为什么在文本字段上没有出现颜色变化?

我知道我可以在IB中设置颜色,但是对于处理了很多都需要相同样式的UI元素的人,子类化使生活变得更加轻松。

具有讽刺意味的是,我以前从来没有必须对NSTextField进行子类化,而这个问题使我感到困惑。

像往常一样,非常感谢任何帮助。我敢肯定它将成为一个“ Doh!”片刻-现在看不到树木的树林(再加上我从凌晨观看过多的世界杯足球赛而感到疲惫,这无济于事)。

===解决方案===

Jaanus提供的解决方案是将其放入viewWillDraw方法。因此,我的(简化的)方法现在看起来像这样:

@implementation MyTextFieldSubclass

-(void)viewWillDraw {
    [super setBackgroundColor:[NSColor redColor]];
    [super setTextColor:[NSColor yellowColor]];
}

@end


谢谢大家帮助。

最佳答案

Preston是正确的:要更改颜色,您不应该子类化,而只需更改文本字段属性。 (哦,这是NSTextfield,它可能当时没有属性...好吧,只需使用getter和setter方法或在IB中正确配置它即可。)

至于


  那么,为什么在文本字段上没有出现颜色变化?


因为您使getter和setter感到困惑。在子类中,您已将它们实现为吸气剂,它们仅返回一种颜色。实际上,它们应该是setter函数(这就是在NSTextfield的内部实现它们的方式):您为它们传递颜色,然后它们去修饰NSTextfield的内部构造,以使颜色发生变化。

编辑:好的,如果您因为总是要设置特定的颜色而进行子类化,则可以执行以下操作

-(void)viewDidAppear { // or whatever is the Appkit equivalent
    [super setBackgroundColor:...];
}

关于objective-c - 子类化NSTextField,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3065676/

10-16 09:29