2

鉴于我似乎每天都在讨论所有复杂的事情,这似乎是“我到底做错了什么,看起来很简单?” 设想!

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

第1步:

创建子类文件:

首先是头文件

@interface MyTextFieldSubclass : NSTextField {
}

@end

和方法文件

@implementation MyTextFieldSubclass

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

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

@end

第2步:

在 Interface Builder 中拖动NSTextField一个窗口,选择Identity检查器中的选项卡并选择类MyTextFieldSubclass

第 3 步:

保存 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

谢谢大家帮助。

4

2 回答 2

3

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

至于

那么为什么文本字段不会发生颜色变化呢?

因为你混淆了getter和setter。在您的子类中,您已将它们实现为 getter,它们只返回一种颜色。实际上,它们应该是 setter 函数(这就是它们在 NSTextfield 的内部实现的方式):你给它们传递一个颜色,然后它们去摆弄 NSTextfield 的任何内部结构,以使颜色发生变化。

编辑:好的,如果您因为总是想设置特定颜色而进行子类化,那么您会执行类似的操作

-(void)viewDidAppear { // or whatever is the Appkit equivalent
    [super setBackgroundColor:...];
}
于 2010-06-17T21:26:30.990 回答
2

由于您可以在 Interface Builder 的属性检查器中设置 NSTextField 的背景颜色和文本颜色,或者您可以通过编程方式使用-setBackgroundColor:-setTextColor:因此不需要创建子类来更改颜色。好像有点矫枉过正。

编辑:如果样式很多元素是一个问题,您是否考虑过使用颜色绑定?最后我检查了一下, NSTextField 没有背景颜色的绑定,但由于您使用的是子类,您可以为其添加绑定

于 2010-06-17T21:22:30.827 回答