Пользовательские виды с раскадровкой - PullRequest
95 голосов
/ 29 февраля 2012

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

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

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

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

Ответы [ 3 ]

188 голосов
/ 25 января 2013

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

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

  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

11 голосов
/ 29 февраля 2012

Если вы просто хотите, чтобы ваши контроллеры представлений были где-то (а не в вашей раскадровке), то есть довольно простой способ сделать это:

1) Создайте свои CustomViewController s (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.
}
1 голос
/ 22 декабря 2015

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

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

Надеюсь, это поможет

Спасибо Vijay

...