2012-02-29 4 views
92

В сложных экранах (контроллеры просмотра) я использовал для разделения всего на более мелкие части (я их называю виджетами). Эти виджеты состоят в основном из файлов MyWidget.h и MyWidget.m, а также файла MyWidget.xib, где корневой элемент является UIView, а класс MyWidget является файловым владельцем UIView. В начале этого виджета я делаю loadNibNamed.Пользовательские виды с раскадрой

В моем контроллере просмотра я затем делаю [[MyWidget alloc] init], который я добавляю к главному представлению View's Controller в качестве дополнительного представления. Это пока работает отлично.

Теперь мне интересно, как сделать то же самое с раскадрой, потому что я не могу начать перетаскивать в UIView где-то, мне всегда нужно начинать с UIViewController, чего я не хочу.

Если нет возможности сделать это с помощью раскадровки, могу ли я просто сделать это по-старому, используя раскадровку для моих основных экранов и segues и использовать отдельный .xib-файл для определения пользовательских представлений?

+0

Вы хотите создать 'xib's для контроллеров просмотреть отдельно, а не в сюжетной доске? – tipycalFlow

+0

Вы нашли решение на этом? – aryaxt

+0

@aryaxt: Я использую смесь раскадровки и xib. Раскадровка для основных экранов и xib с только UIView в качестве корня для сложных видов или виджетов. Так что не совсем ответ на мой оригинальный вопрос (с помощью раскадровки), но в основном делаю то же, что и раньше. – znq

ответ

11

Если вы просто хотите, чтобы ваши контроллеры просматривать либо еще, где (а не в вашей сюжетной доске), то есть довольно простой способ для достижения этой цели:

1) Создайте CustomViewController с (abcdController в коде, который я пробовал) с их индивидуальными xib s, как обычно.

2) Добавить UIViewController (или что-то другое, что было суперкласс вашего CustomViewController) на сюжетную панель.

3) Установите CustomClass в CustomViewController вместо UIViewController, как показано здесь:

enter image description here

4) Наконец, в вашем viewDidLoad, загрузите пользовательские xib и вы сделали.

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil]; 
    // Do any additional setup after loading the view from its nib. 
} 
+3

Благодарим за подробный ответ, но на самом деле я не ищу настраиваемый контроллер представлений, а пользовательский вид (виджет), который добавляется к стандарту UIViewController. Поэтому диспетчер представлений не является проблемой, но мне было интересно, как лучше всего создавать пользовательские виджеты. Либо A) делайте это так, как я делал раньше, с .xib-файлом или B) каким-то другим подходом, который я еще не знаю, пока :-) – znq

+1

Хм ... Думаю, у меня есть то, что вы хотите. В основном вы хотите обрабатывать несколько просмотров с помощью одного и того же контроллера, не так ли? Я не могу думать о другом, кроме 'loadNibNamed' в этом случае ... XO – tipycalFlow

+0

Это решило эту проблему для меня: http://stackoverflow.com/questions/11047991/storyboard-crash-coding-compliant-key- sceneviewcontroller Однако, вместо viewDidLoad, я использовал loadView ... – Morkrom

186

Ввод виджет/вид в отдельных работах .xib файлов, и подходит, особенно если вы можете ссылаться на тот же вид из нескольких контроллеров View.

Однако иногда вы хотите видеть дополнительный вид/виджет в одном и том же раскадровке, и это возможно. Вот как это сделать:

  1. Выберите контроллер представления в IB (нажмите на черную полосу ниже его), а затем перетащить UIView из библиотеки объектов в черную полосу:

    enter image description here

  2. Когда представление находится в черной полосе, оно создается как любое другое представление в IB, но просто не добавляется в вашу иерархию представлений, пока вы не сделаете это в коде.Изменить класс мнения, чтобы соответствовать своему собственному подклассу, если это необходимо:

    enter image description here

  3. Вы можете подключить его к контроллеру представления, как вы бы подключить любой другой вид: enter image description here

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

    enter image description here


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

Первое обходное решение - перетащить вид из черной полосы обратно в вид контроллера вашего вида, отредактировать его, а затем перетащить обратно в черную полосу, как только вы закончите. Это хлопотно, но надежно.

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

  1. Перетащите UITableView из библиотеки объектов в ваше добавляемом зрение.
  2. Затем перетащите UITableViewCell в этот UITableView.

    enter image description here

  3. После того, как вы сделаете это, ваш взгляд выскакивает волшебно стороной, но у вас есть UITableView, что вы не хотите. Вы можете изменить размер до 0x0, или вы можете удалить его, и ваш UIView (обычно) останется видимым.

  4. Иногда вторичный вид снова становится скрытым в IB. Вы можете повторить вышеуказанные шаги, если вы удалили UITableView или если UITableView все еще находится в иерархии, вам просто нужно щелкнуть по UITableViewCell, и представление снова появится.

Второй метод работает для UIViews, но не так хорошо для UIToolbars и невозможно UIButtons, поэтому чистое решение я нашел, когда вам необходимо включить множество различных подвидов, чтобы прикрепить один вторичный UIView к вашему просмотрите контроллер как контейнер, который никогда не отображается, помещайте все свои вторичные представления и используйте UITableViewCell трюк, чтобы сделать все видимым. Я изменяю размер моего макета UITableView до 0x0, чтобы сделать его невидимым. Вот скриншот того, как все это выглядит вместе:

enter image description here

+0

Март 2013 года, мне не нужно было это делать - вы должны полностью игнорировать черную полосу и перетащить ваш взгляд прямо в основной режим, и он отлично работает (Xcode 4.5+) – Adam

+0

Можно ли повторно использовать этот пользовательский uivew на том же ViewController - если я раньше. нужны два пользовательских uivews - И если это так? –

+2

Dang, я предпочитаю просто создать отдельный xib. Я, вероятно, не буду помнить об этом, когда мне нужно обновить приложение через 6 месяцев. – Sandy

0

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

ex: 
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"]; 
UIView* view = myViewController.view; //Get the view from your StoryBoard. 

Надеется, что это помогает

Благодаря Виджай

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