2011-11-07 3 views
1

Я создал представление «MyView» в бобах файле «MyNib» Мой вопрос заключается в том, чтобы создать объект NSView с помощью View NameКак создать представление программно в какао MacOSX

У меня есть пользовательский класс для моего WindowController. Использование Interface Builder я не могу создать выход в классе mywindowController.

Так что, если нет способа создать выход с помощью конструктора интерфейса, каким способом создать NSVIew.

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

ответ

1

Вы читали documentation? Когда вы загружаете nibs/xibs, вы должны указать владельца файла (объект верхнего уровня в xib). Это означает, что любой объект, который вы передаете, поскольку владелец должен иметь нужные выходы.

BOOL success = [NSBundle loadNibNamed:@"MyNib" owner:selfOrSomeControllerWithOutlets]; 

Это самый простой способ загрузить содержимое xib и подключить его к любому владельцу, которого вы указали.

Вы также можете создать экземпляр контроллера и загрузить его xib за один раз. Например, контроллер view/view может быть загружен контроллером главного окна. Внутри контроллера окна, вы можете иметь -widgetView (который загружает вид внутри WidgetView.xib) метод, который делает это:

- (NSView *)widgetView 
{ 
    if (!_widgetViewController) 
     _widgetViewController = [[MyWidgetViewController alloc] initWithNibName:@"WidgetView" bundle:nil]; 
    return [_widgetViewController view]; 
} 

В этом случае MyWidgetViewController является подкласс NSViewController (который дает ему -view недвижимость , который ссылается на некоторый вид верхнего уровня в xib. В xib имя класса владельца файла установлено в MyWidgetViewController, а его точка просмотра подключена к виду вашего основного контейнера. Когда контроллер успешно инициализируется с помощью xib, -view (и любые другие ваши подклассы), и теперь этот контроллер подключен к содержимому xib.

Теперь, когда вы впервые запрашиваете -widgetView, он загружает xib и hand (или ноль). Каждый последующий вызов просто возвращает уже загруженное представление. Это называется «ленивой загрузкой» и, как правило, лучше всего подходит для просмотров, которые не всегда используются. Вы также можете сделать это для нескольких «копий». Просто добавьте каждый контроллер представления в контейнер где-нибудь, когда они созданы, и управляйте им, как вам нужно.

Конечно, приведенный выше код игнорирует потенциал, который не может быть размещен xib (в этом случае -initWithNibName: bundle: will return nil), и вы не должны этого делать. Определенно обрабатывайте ошибку, используя NSAssert ...() и прекратите изящно (поскольку что-то не так с пакетом приложений, если xib не может быть найден).

+0

Спасибо за приятное объяснение – user970251

Смежные вопросы