Пользовательские виды с раскадровки

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

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

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

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

Ответ 1

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

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

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

    enter image description here

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

    enter image description here

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

  • Добавленный вид отображается в вашем документе, и вы также можете подключать к нему действия и ссылки:

    enter image description here


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

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

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

  • Перетащите UITableView из библиотеки объектов в новое добавленное представление.
  • Затем перетащите UITableViewCell в этот UITableView.

    enter image description here

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

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

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

enter image description here

Ответ 2

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

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

2) Добавьте a 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

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

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

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

Спасибо Виджей