考虑到我似乎每天都要处理的所有复杂事情,这似乎是“我做错了什么似乎很简单?”场景!
我想将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
第3步:
保存IB文件,构建并运行应用程序
问题
当我运行构建时,文本字段不反映颜色子类。但是,我知道正在调用子类,因为如果我添加以下方法,则会在文本更改时调用它。
-(void)textDidChange:(NSNotification *)notification {
NSLog(@"My text changed");
}
那么为什么文本字段中不会发生颜色变化?
我知道我可以在IB中设置颜色,但是对于那些处理了所有需要相同样式的 lot UI元素的人来说,子类化会让生活更轻松。
具有讽刺意味的是,我从来没有必要继承NSTextField
,而且这个让我感到难过。
像往常一样,任何和所有的帮助非常感谢。我相信它会变成一个“Doh!”那一刻 - 现在不能看到木头的树木了(再加上我从早上看太多的世界杯足球赛中精疲力尽,从来没有帮助过。)
=== SOLUTION ===
Jaanus提供的解决方案是将其放入viewWillDraw
方法中。因此,我的(简化)方法现在看起来像这样:
@implementation MyTextFieldSubclass
-(void)viewWillDraw {
[super setBackgroundColor:[NSColor redColor]];
[super setTextColor:[NSColor yellowColor]];
}
@end
谢谢你的帮助。
答案 0 :(得分:3)
Preston是正确的:要更改颜色,不应该是子类,只需更改文本字段属性即可。 (哦,它是NSTextfield,它可能没有属性然后......好吧,只需使用getter和setter方法或在IB中正确配置它。)
至于
那么为什么文本字段中不会发生颜色变化?
因为你混淆了吸气剂和二传手。在您的子类中,您已将它们实现为getter,它们只返回一种颜色。实际上,它们应该是setter函数(这就是它们在NSTextfield的内部实现的方式):你给它们传递一种颜色,然后它们就会调整NSTextfield所具有的内部结构,以使颜色发生变化。
编辑:好的,如果你是子类,因为你总是想设置一个特定的颜色,你会做类似的事情
-(void)viewDidAppear { // or whatever is the Appkit equivalent
[super setBackgroundColor:...];
}
答案 1 :(得分:2)
由于您可以在Interface Builder的“属性”检查器中设置NSTextField的背景颜色和文本颜色,或者可以通过编程方式使用-setBackgroundColor:
和-setTextColor:
,因此不需要创建子类只是为了改变颜色。看起来像是矫枉过正。
编辑:如果样式化很多元素是个问题,您是否考虑过使用颜色绑定?最后我查了一下,NSTextField没有背景颜色的绑定,但是既然你正在使用子类,你可以add a binding for it。