我想了解子类如何在可可中工作。可可子类奇怪
我在XCode 5.1中创建了一个新的Cocoa应用程序项目。
我将一个新的自定义视图拖到主窗口上。
我创建了一个新的Objective-C类CustomViewClass
并将其设置为NSView
的子类。这将生成以下:
#import <Cocoa/Cocoa.h>
@interface CustomViewClass : NSView
@end
CustomViewClass.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 initialised");
线,所以我可以跟踪是怎么回事。
在界面构建器中,我选择自定义视图,并在标识检查器中将其设置为CustomView的自定义类。然后我运行该应用程序。
正如所料,我在控制台中收到Custom View initialised
消息。
我做的正是用的NSTextField将它添加到窗口一样,创建一个新类TextFieldClass
和的NSTextField自定义类是textFieldClass时。我还在上述相同的地方添加了一个NSLog(@"Text Field initialised");
来跟踪事物。
但是,当我运行该应用程序时,我只收到控制台中的Custom View initialised
消息,而不是NSLog(@"Text Field initialised");
消息。
因此,最初我认为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");
}
运行的应用程序,你瞧,我每次在文本字段中键入时间,我得到的控制台My text changed
消息。
所以我的问题是,这是怎么回事? NSTextField如何被初始化,以及如何覆盖它的初始化程序?
为什么自定义视图的行为似乎与NSTextField不同?
源代码here
没错,就是工作。你在哪里可以找到控制器的初始化者是什么?我查看了NSTextField的API参考,但未列出initWithCoder。 – dwkns
你需要继续上去的继承..并检查超级类的文档.. initWithCoder:在NSObject中声明 –