子类化NSTextField

时间:2010-06-17 21:12:49

标签: objective-c cocoa xcode subclass nstextfield

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

我想将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

谢谢你的帮助。

2 个答案:

答案 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