Какао: NSView рисовать рисовать поверх IBOutlets - PullRequest
0 голосов
/ 17 ноября 2011

У меня есть NSView в IB, который находится над окном приложения. У меня есть подкласс NSView (AddSource), который я назначаю NSView.

На awakeFromNib я создаю представление:

//add a new Add Source class
addSourceView = [[AddSource alloc] initWithFrame:NSMakeRect(0.0, 959.0, 307.0, 118.0)];
[[winMain contentView] addSubview:addSourceView];

в методе addRourceView drawRect Я добавляю белый вид к виду:

[[NSColor whiteColor] set];
NSRectFill(rect);
[self setNeedsDisplay:YES];//added this to see if it might solve the problem

В winMain's contentView у меня есть NSButton, который при нажатии вставляет addSourceView в окно:

NSRect addSourceViewFrame = [addSourceView frame];
addSourceViewFrame.origin.y = 841.0;
[[addSourceView animator] setFrame:addSourceViewFrame];

Но кажется, что приложение рисует поверх IBOutlets, которые я поместил в NSView в IB. Если в IB я создаю NSView так, чтобы он отображался на экране при запуске приложения, все работает нормально, там присутствуют IBOutlets, а также цвет фона.

Я не уверен, почему это происходит. Я делал это раньше без проблем. Должно быть, в этот раз я делаю что-то другое.

Спасибо за любую помощь.

Screen captures

* примечание - на третьем снимке экрана, когда я говорю, что это то, как приложение выглядит при открытии, именно тогда я жестко кодирую позицию Y в NSView. Когда он работает правильно, он должен открыться как снимок экрана 1.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2011

Вы добавили ДВА AddSource просмотров в окно.Вы добавили один в IB - это представление содержит ваши текстовые поля и кнопки, которые подключены к IBOutlets, и оно расположено за пределами окна.

Затем в -awakeFromNib вы создаете другое, пустое представление AddSource (ничего не содержащее).) и анимировать его в окне.

Я не могу рекомендовать Hillegass как лучшее введение в IB и правильный способ создания приложений Cocoa.

Кроме того, утверждения могут быть полезнычтобы убедиться, что то, что, по вашему мнению, происходит, на самом деле происходит.

Если вы уверены, что добавили кнопку к своему представлению в IB, подтвердите, что это так: -

- (void)awakeFromNib {
      NSAssert( myButton, @"did i hook up the outlet?");
}

NSAssert - это макрос с нулевыми накладными расходами в сборке выпуска.

Вызов [self setNeedsDisplay:YES] из -drawRect просто вызывает повторный вызов того же -drawRect.Это доставит вам большие проблемы.

0 голосов
/ 17 ноября 2011

Скорее всего, ваши кнопки и пользовательский вид - это братья и сестры, то есть они оба являются подпредставлениями представления содержимого вашего окна.Поскольку братья и сестры «сложены» в зависимости от порядка их добавления, при добавлении представления в коде оно добавляется поверх кнопок.Вы должны быть в состоянии исправить это, явно указав, где представление должно быть расположено относительно его новых братьев и сестер, например:

[[winMain contentView] addSubview:addSourceView positioned:NSWindowBelow relativeTo:nil];

, что должно разместить его ниже любых существующих подпредставлений представления содержимого вашего окна.Кроме того, удалите линию setNeedsDisplay: в drawRect, которая приводит к ненужному, возможно, бесконечному перерисовыванию.

РЕДАКТИРОВАТЬ: ОК, я вижу, что вы делаете.для просмотра в NIB путем перетаскивания объекта «Пользовательский вид» в левую часть (раздел вертикально выровненных архивных объектов) и добавления туда своих элементов управления, которые должны гарантировать, что элементы управления фактически являются подвидами представления, тогда вы можете просто создатьссылаться на архивное представление в коде и динамически добавлять / удалять его по мере необходимости.

Честно говоря, вам, вероятно, следует использовать лист для таких модальных диалогов.Зачем изобретать велосипед и делать ваше приложение более уродливым?

...