Как создать модульное представление раскрытия на основе NSViewController, в котором все раскрытые представления содержатся в их собственном NIB?

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

Вот упрощенный пример. У нас есть два отдельных пера:

  1. DisclosureViewController Контроллер представления раскрытия
  2. ContentViewController Контроллер представления содержимого

Каков самый простой способ загрузить представление содержимого внутри представления заполнителя представления раскрытия? Можно ли это сделать только в IB?

В настоящее время мой AppDelegate имеет много избыточности, потому что ему нужно хранить ссылки на оба контроллера представления. Интересно, есть ли способ упростить ситуацию? В этом простом примере AppDelegate будет загружаться из двух разных перьев, используя такой код:

// In AppDelegate.m
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [_disclosureView1.view replaceSubview:_disclosureView1.placeholder with:_contentView1.view];
    [(NSView*)_window.contentView addSubview:_disclosureView1.view];
}

person Daniel Farrell    schedule 19.01.2014    source источник
comment
Нет, на самом деле, никогда не кодировал для iOS, хотя я понимаю, что вы имеете в виду. UIViewController активно используется на этой платформе.   -  person Daniel Farrell    schedule 19.01.2014


Ответы (1)


Вы можете иметь NSViewControllers в своем основном XIB, соответствующем представлениям, которые вы хотите в своем NSStackView — в инспекторе XIB вы можете установить имя других XIB, которые они должны загрузить, чтобы получить свои «представления».

Предполагая, что у вас есть IBOutlets для этих viewController в вашем основном XIB, это было бы так же просто, как вызвать:

 /* load the views into the stack view */
_stackView = [NSStackView stackViewWithViews:@[_viewControllerOutlet1.view, _viewControllerOutlet2.view, _viewControllerOutlet3.view]];
person Wil Shipley    schedule 19.01.2014
comment
Просто заполните имя пера для пера с представлением. В этом пера «Владелец файла» должен быть типа NSViewController, и его выход в представление должен быть подключен. - person Wil Shipley; 20.01.2014
comment
Я полностью переписал вопрос, чтобы было легче понять, о чем я спрашивал. Извините за сумбурность, может еще раз прокомментируете? - person Daniel Farrell; 20.01.2014
comment
Прохладный. Большая проблема, с которой мы сталкиваемся в OS X, заключается в том, что мы не можем сказать: «Это представление в этом XIB является заполнителем из другого XIB», и это все еще требует решения, кроме команды AppKit. - person Wil Shipley; 20.01.2014
comment
Благодарю вас! Теперь я понимаю. Буду ломать голову, пытаясь понять, почему код выглядит ужасно, ответ (как обычно) в том, что я боролся с Cocoa. В конце концов, мне просто придется придерживаться двух контроллеров. Кстати, я написал InnerShadowTextFieldCell по вашему совету из другой темы github.com/danieljfarrell/InnerShadowTextFieldCell. - person Daniel Farrell; 20.01.2014
comment
Уил, не могли бы вы уточнить: если нужно использовать этот код для построения представления стека, зачем вообще иметь контроллеры в пере? - person Chris Page; 06.05.2014
comment
Я бы предпочел иметь разные XIB для каждого подпредставления в stackView, независимо от того, как я собираю конечный объект. Просто мне кажется чище. Но то, что, по вашему мнению, работает лучше всего для вас, хорошо! - person Wil Shipley; 07.05.2014
comment
Это момент, который навсегда взорвал мой мозг. Может быть, будет лучше с раскадровками и IBDesignable и тому подобным в Xcode 6 и 10.10. Просто кажется, что наличие прокси-контроллера представления в nib/xib также должно позволить вам волшебным образом загрузить связанное представление для дизайна из этого другого места. По крайней мере, пока новый материал не появится, мы не будем знать наверняка, но похоже, что он может быть там. :) - person uchuugaka; 17.08.2014