考虑到我似乎每天都涉及的所有复杂事情,这似乎是“我到底在做什么错,这似乎很简单?”场景!
我想对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/