drawRect не вызывается в добавленном подпредставлении

Я пытаюсь программно создать окно с настраиваемым contentView и одним настраиваемым NSTextField элементом управления, но у меня возникают проблемы с отображением этой иерархии окон и представлений.

Я создаю собственное окно без полей и переопределяю его setContentView / contentView аксессоры. Кажется, это работает нормально, и вызываются пользовательские методы contentView initWithFrame и drawRect, заставляющие contentView правильно рисовать себя.

Но как только я пытаюсь программно добавить пользовательский NSTextField в contentView, он не добавляется и не отображается. Говоря custom, я имею в виду, что я переопределяю назначенный инициализатор (initWithFrame:frame - только для настройки пользовательского шрифта) и метод drawRect, который выглядит так:

- (void)drawRect:(NSRect)rect {
    NSRect bounds = [self bounds];
    [super drawRect:bounds];
}

Инициализатор пользовательского contentView выглядит так:

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self != nil) {
      // i want to draw itself to the same 
      // size as contentView thus i'm using same frame
      CustomTextField *textField = [[CustomTextField alloc] initWithFrame:frame];
      [self addSubview:textField];
      [self setNeedsDisplay:YES];
    }
    return self;
}

Я боролся с этим несколько часов, поэтому очень ценю любые указатели. Дополнительный код доступен по запросу.)


person Eimantas    schedule 26.09.2009    source источник


Ответы (2)


Ваш -drawRect: override кажется мне неправильным, почему вы намеренно игнорируете переданный аргумент in rect? Зачем это нужно?

Что касается того, почему текстовое поле не отображается, скорее всего, вы его не настроили. Когда вы создаете NSTextField в коде, вы не получаете того же, что и экземпляр по умолчанию, который вы получаете при перетаскивании текстового поля в представление в IB. Вам нужно будет настроить NSTextField и его NSTextFieldCell, чтобы получить желаемый внешний вид.

Я использую программно добавленное текстовое поле, которое настраиваю следующим образом:

_textField = [[NSTextField alloc] initWithFrame:textFieldRect];
[[_textField cell] setControlSize:NSSmallControlSize];
[_textField setFont:[NSFont systemFontOfSize:[NSFont smallSystemFontSize]]];
[_textField setBezelStyle:NSTextFieldSquareBezel];
[_textField setDrawsBackground:YES];
[_textField setBordered:YES];
[_textField setImportsGraphics:NO];
[_textField setAllowsEditingTextAttributes:NO];
[_textField setBezeled:YES];
[_textField sizeToFit];
[self addSubview:_textField];
[_textField setFrame:textFieldRect];
[_textField setAutoresizingMask:NSViewMinXMargin];
person Rob Keniger    schedule 27.09.2009
comment
ну, я даже пытался не переопределять метод drawRect или просто рисовать черный прямоугольник. Причина, по которой я игнорирую параметр rect, заключается в том, что он определяет только область, которую необходимо перерисовать. Например, когда курсор в текстовом поле мигает - ОС отправляет drawRect с сообщением с параметром rect, который определяет только область этого курсора. Спасибо за совет, постараюсь ему последовать. - person Eimantas; 27.09.2009

Спасибо за ответы!

Я нашел свою проблему. Причина, по которой drawRect не вызывается, заключается в том, что настраиваемое текстовое поле было нарисовано вне рамки представления содержимого. Думаю, я забыл упомянуть важную деталь, что я рисую окно по центру экрана, поэтому его рамка была со смещением x / y.

Чтобы заполнить окно представлением содержимого, я инициализирую contentView с тем же фреймом, что и окно (что означает такое же смещение (x; y) от точки (0; 0) окна).

Теперь я просто не могу писать в настраиваемое текстовое поле, но я думаю, что это еще одна проблема, с которой я могу справиться.

person Eimantas    schedule 27.09.2009