Я пытаюсь понять, как работает подклассификация в какао.Какао Подклассическая странность
Я создал новый проект приложений какао в XCode 5.1.
Я перетащил новый пользовательский вид в главное окно.
Я создаю новый класс Objective-C CustomViewClass
и устанавливаю его как подкласс NSView
. Это порождает следующее: что я добавил NSLog(@"Custom View initialised");
линию таким образом я могу отслеживать, что происходит на
#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
Примечание.
В интерфейсе Builder я выбираю пользовательский вид, а внутри Idenditiy Inspecter установлен его собственный класс для 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
Да, это работает. Где вы можете узнать, что такое инициализаторы для элемента управления? Я просмотрел ссылку API для NSTextField, но initWithCoder не указан. – dwkns
Вам нужно продолжать идти по наследству .. и проверить документацию суперкласса .. initWithCoder: объявлен в NSObject –