gpt4 book ai didi

objective-c - NSTextField 的子类化

转载 作者:行者123 更新时间:2023-12-03 16:27:52 24 4
gpt4 key购买 nike

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

我想对 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 文件,构建并运行应用程序

问题

当我运行构建时,文本字段不反射(reflect)颜色子类化。但是,我知道子类正在被调用,因为如果我添加以下方法,它就会在文本更改时被调用。

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

那么为什么文本字段上没有发生颜色变化?

我知道我可以在 IB 中设置颜色,但是对于处理过大量 UI 元素(所有这些元素都需要相同样式)的人来说,子类化会让生活变得非常轻松。 p>

讽刺的是,我以前从未需要对 NSTextField 进行子类化,而这个让我难住了。

像往常一样,非常感谢任何和所有的帮助。我确信它会变成“Doh!”时刻 - 现在只是看不见树木(加上我在一大早观看太多世界杯足球赛而筋疲力尽,这毫无帮助)。

===解决方案===

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

@implementation MyTextFieldSubclass

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

@end

谢谢大家的帮助。

最佳答案

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

至于

So why does the color change not occur on the text fields?

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com