На сложных экранах (контроллеры представления) я обычно разделял все на более мелкие части (я называю их виджетами). Эти виджеты состоят в основном из a MyWidget.h
и MyWidget.m
файла, а также MyWidget.xib
файла, где корневым элементом является a, UIView
а класс MyWidget является владельцем файла UIView. В инициализации этого виджета я делаю loadNibNamed
.
Затем в моем контроллере представления я делаю элемент [[MyWidget alloc] init]
, который добавляю в главное представление контроллера представления в качестве вспомогательного представления. Пока это работает отлично.
Теперь мне интересно, как сделать то же самое с раскадровкой, потому что я действительно не могу начать перетаскивать UIView
куда-то, мне всегда нужно начинать с UIViewController
, чего я не хочу.
Если нет возможности сделать это с помощью раскадровки, могу ли я просто сделать это старым способом, используя раскадровку для моих основных экранов и переходов, и использовать отдельный файл .xib для определения пользовательских представлений?
источник
xib
s для ваших контроллеров представления отдельно, а не в раскадровке?Ответы:
Помещение виджета / представления в отдельный файл .xib работает и подходит, особенно если вы можете захотеть ссылаться на то же представление из нескольких контроллеров представления.
Однако иногда вам все же нужно увидеть дополнительное представление / виджет в той же раскадровке, и это возможно. Вот как это сделать:
Выберите контроллер представления в IB (щелкните черную полосу под представлением), затем перетащите UIView из библиотеки объектов на черную полосу:
Когда представление находится на черной полосе, оно создается, как и любое другое представление в IB, но просто не добавляется в вашу иерархию представлений, пока вы не сделаете это в коде. При необходимости измените класс представления, чтобы он соответствовал вашему собственному подклассу:
Вы можете подключить его к своему контроллеру представления, как и любое другое представление:
Добавленное представление отображается в структуре документа, и вы также можете подключать действия и ссылки:
Теперь остается проблема в том, что вы не можете увидеть представление независимо от того, сколько раз вы пытаетесь щелкнуть или дважды щелкнуть мышью, что нарушит всю цель помещения его в одну раскадровку. К счастью, я знаю два обходных пути.
Первый обходной путь - перетащить представление с черной полосы обратно в представление контроллера представления, отредактировать его, а затем перетащить обратно на черную полосу, как только вы закончите. Это хлопотно, но надежно.
Другой обходной путь более привередлив, но я предпочитаю его, потому что он позволяет мне видеть все мои представления одновременно:
Перетащите UITableView из библиотеки объектов в только что добавленное представление.
Затем перетащите UITableViewCell в этот UITableView.
Как только вы это сделаете, ваше представление волшебным образом появится сбоку, но у вас есть UITableView, который вам не нужен. Вы можете либо изменить его размер до 0x0, либо удалить его, и ваш UIView (обычно) останется видимым.
Иногда вторичный вид снова скрывается в IB. Вы можете повторить вышеуказанные шаги, если удалили UITableView или если UITableView все еще находится в иерархии, вам просто нужно щелкнуть UITableViewCell, и представление появится снова.
Второй метод работает для UIViews, но не так хорошо для UIToolbars и невозможен для UIButtons, поэтому самое чистое решение, которое я нашел, когда вам нужно включить много разных подвидов, - это прикрепить один вторичный UIView к вашему контроллеру представления в качестве контейнера, который никогда не отображается, поместите туда все ваши вторичные представления и используйте трюк UITableViewCell, чтобы сделать все видимым. Я изменяю размер своего фиктивного UITableView на 0x0, чтобы сделать его невидимым. Вот скриншот того, как все это выглядит вместе:
источник
Если вы просто хотите сделать свои контроллеры представлений где-то еще (а не на своей раскадровке), то есть довольно простой способ сделать это:
1) Создайте свои
CustomViewController
s (abcdController
в коде, который я пробовал) с их индивидуальнымиxib
s, как обычно.2) Добавьте
UIViewController
(или что-то еще, что было вашим суперклассомCustomViewController
) в раскадровку.3) Установите CustomClass
CustomViewController
вместо,UIViewController
как показано здесь:4) Наконец,
viewDidLoad
загрузите кастом,xib
и все готово.источник
loadNibNamed
в этом случае ... XOЯ думаю, вы можете сделать что-то подобное, чтобы получить экземпляр определенного контроллера просмотра из раскадровки и использовать вид поверх него.
Надеюсь это поможет
Спасибо виджай
источник