Эквивалент пользовательского элемента управления в XCode/MonoMac

Я разработчик .NET, пробующий свои силы в портировании приложения Windows для OSX. Я использую MonoDevelop и MonoMac (с XCode Interface Builder) для создания пользовательского интерфейса.

Исходя из Windows, я пытаюсь понять Cocoa-эквивалент «UserControl», так как я широко использовал их в своей версии WinForm. У меня есть группа элементов управления (скажем, метка, текстовое поле и кнопка), которые я хочу упаковать и повторно использовать в разных местах моего пользовательского интерфейса Cocoa.

Насколько я понимаю, мне нужно создать «настраиваемое представление», создав подкласс NSView (назовем его «MyView»). Я могу создать «MyView» в построителе интерфейсов, но когда я использую его в своем главном окне, он всегда отображается пустым/пустым.

Вот как я размещаю элемент управления в своей основной форме в IB: я добавляю настраиваемое представление (NSView) из библиотеки объектов, затем изменяю свойство «класс» в разделе «Пользовательский класс» на «MyView». Это не проблема, если элемент управления не отображается во время разработки, но он также абсолютно пуст во время выполнения.

Я подозреваю, что упускаю что-то действительно простое/очевидное. Предполагается ли использовать пользовательские представления таким образом? Все примеры, которые я нашел в Интернете, похоже, обсуждают пользовательский рисунок, который мне не нужен (я просто хочу использовать несколько элементов управления вместе, чтобы я мог их повторно использовать). Может ли кто-нибудь пролить свет на это для меня?

Заранее спасибо.


person D. Tony    schedule 19.04.2012    source источник


Ответы (2)


Если вам просто нужна группа стандартных элементов управления, вам может понадобиться отдельное представление NIB/XIB. Затем вы будете загружать этот NIB каждый раз, когда хотите создать экземпляр этой группы, получать из него представление верхнего уровня и вставлять это представление в какую-либо другую иерархию представлений. Вы бы использовали NSViewController (или пользовательский подкласс), чтобы владеть и загружать этот NIB.

Вы также можете добавить отдельное представление к NIB, которое уже содержит, скажем, окно. Владелец NIB (часто экземпляр NSWindowController или подкласса) будет иметь выход для ссылки на эту автономную иерархию представлений. Затем ваш код может использовать эту иерархию представлений по своему усмотрению, вставляя ее в иерархию представлений окна в соответствующем месте.

Обычно вы не используете настраиваемый класс представления только для группировки стандартных элементов управления. Вы создаете подкласс вида только для создания нестандартного вида, который рисует нестандартным образом или предоставляет другую технику манипулирования.

person Ken Thomases    schedule 19.04.2012
comment
Спасибо, это было очень полезно (извините за медленный ответ... я отвлекся). Я все еще пытаюсь вставить свой элемент управления в иерархию представлений именно там, где я этого хочу, но у меня хорошее начало. - person D. Tony; 11.05.2012

Это сработало для меня:

  1. Поместите «Пользовательский вид» в свое окно (НЕ переименовывайте класс в инспекторе идентификации).

  2. Создайте выход для пользовательского представления в контроллере вашего окна под названием «CustomView».

  3. В методе awakeFromNib ваших оконных контроллеров добавьте следующий код

    this.CustomView.AddSubview(new YourCustomViewController().View);

Примечание: другие ответы на этот вопрос предполагают, что в вашем представлении нет XIB, и поэтому оно отображается пустым, потому что оно не загружено должным образом.

person Herman Schoenfeld    schedule 26.09.2012