gpt4 book ai didi

objective-c - Cocoa 子类化的怪异

转载 作者:行者123 更新时间:2023-12-03 16:31:37 25 4
gpt4 key购买 nike

我试图了解子类化在 Cocoa 中是如何工作的。

我在 XCode 5.1 中创建了一个新的 Cocoa 应用程序项目。

我将一个新的自定义 View 拖到主窗口上。

我创建了一个新的 Objective-C 类 CustomViewClass 并将其设置为 NSView 的子类。这会生成以下内容:

自定义ViewClass.h
#import <Cocoa/Cocoa.h>

@interface CustomViewClass : NSView

@end
自定义ViewClass.m
#import "CustomViewClass.h"

@implementation CustomViewClass

- (id)initWithFrame:(NSRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
NSLog(@"Custom View initialised");
}
return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
[super drawRect:dirtyRect];

// Drawing code here.
}

@end

请注意,我添加了 NSLog(@"Custom View Initialized"); 行,以便我可以跟踪正在发生的情况。

在界面生成器中,我选择自定义 View ,并在身份检查器中将其自定义类设置为 CustomView。然后我运行该应用程序。

正如预期的那样,我在控制台中收到了一条自定义 View 已初始化消息。

我对 NSTextField 执行完全相同的操作,将其添加到窗口中,创建一个新类 TextFieldClass 并且 NSTextField 自定义类是 TextFieldClass。我还在与上面相同的位置添加了一个 NSLog(@"Text Field Initialized"); 来跟踪事物。

但是,当我运行应用程序时,我只在控制台中收到 Custom Viewinitialized 消息,而不是 NSLog(@"Text Fieldinitialized"); 消息。

所以最初我认为 NSTextField 在创建时没有收到 initWithFrame 消息。所以我向 TextFieldClass 添加一个初始化程序:

- (id)init {
self = [super init];
if (self) {
// Initialization code here.
NSLog(@"Text Field initialised");
}
return self;
}

但是这似乎仍然没有被调用。

因此我认为 NSTextField 只是没有被子类化。但是,当我将此方法添加到 TextFieldClass 时:

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

运行应用程序,你会发现,每次我在文本字段中输入内容时,我都会在控制台中收到我的文本已更改消息。

所以我的问题是,这是怎么回事? NSTextField 如何初始化以及如何覆盖它的初始化程序?

为什么自定义 View 的行为似乎与 NSTextField 不同?

源代码here

最佳答案

对于你的第一个问题, NSTextFiled 通过初始化

- (id)initWithCoder:(NSCoder *)aDecoder

在本例中,您从调色板中拖动了一个 NSTextField,然后将类更改为身份检查器中的自定义文本字段类。因此将调用 initWithCoder: 而不是 initWithFrame:。对于从调色板拖动的任何对象(自定义 View 除外)也是如此

相反,如果您从调色板中拖动“自定义 View ”并将类更改为自定义文本字段类,则将调用 initWithFrame:

您创建的CustomViewClass是第二种情况,因此调用initWithFrame:TextFieldClass 是第一种情况,因此调用 initWithCoder:

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

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