Как программно создать представление в macacx для какао - PullRequest
1 голос
/ 07 ноября 2011

Я создал представление «MyView» в файле пера «MyNib» Мой вопрос заключается в том, как создать объект NSView, используя имя представления

У меня есть собственный класс для моего WindowController. Используя Интерфейсный Разработчик, я не могу создать розетку в классе mywindowController.

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

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

1 Ответ

1 голос
/ 07 ноября 2011

Вы прочитали документацию ? Когда вы загружаете 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 и возвращает вид назад (или ноль). Каждый последующий вызов просто вернет уже загруженный вид. Это называется «отложенной загрузкой» и, как правило, это лучший способ использовать представления, которые не всегда используются. Вы также можете сделать это для нескольких «копий». Просто добавьте каждый контроллер представления в контейнер где-нибудь, когда они будут созданы, и управляйте им, как вам нужно.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...