Спеціальні подання за допомогою Storyboard


96

На складних екранах (контролери перегляду) я раніше розділяв ціле на менші частини (я називаю їх віджетами). Ці віджети в основному складаються з a MyWidget.hі MyWidget.mфайлу, а також MyWidget.xibфайлу, де кореневим елементом є a, UIViewа клас MyWidget є власником файлу UIView. У ініціалізації цього віджету я роблю a loadNibNamed.

Потім у своєму View Controller я роблю a [[MyWidget alloc] init], яке додаю до основного подання View View Controller як допоміжний вигляд. Наразі це працює чудово.

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

Якщо це неможливо зробити за допомогою Storyboard, чи можу я просто зробити це по-старому, використовуючи Storyboard для моїх основних екранів та сегментів, і використовувати окремий файл .xib для визначення власних подань?


Ви хочете створити xibs для своїх контролерів перегляду окремо, а не на дошці сюжетів?
tipycal

Ви знайшли рішення для цього?
aryaxt

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

в наші дні просто використовуйте перегляд контейнера , це справді так просто .. stackoverflow.com/questions/23399061/…
Fattie

Відповіді:


189

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

Однак іноді ви хочете побачити додатковий вигляд / віджет у межах однієї дошки, і це можливо. Ось як ви це робите:

  1. Виберіть контролер перегляду в IB (клацніть на чорній смузі під видом), а потім перетягніть UIView з бібліотеки об’єктів на чорну панель:

    введіть тут опис зображення

  2. Коли подання знаходиться на чорній смузі, воно створюється як інший вигляд у IB, але просто не додається до вашої ієрархії подання, поки ви не зробите це в коді. За потреби змініть клас подання, щоб він відповідав вашому власному підкласу:

    введіть тут опис зображення

  3. Ви можете підключити його до свого контролера перегляду, як і будь-який інший вигляд: введіть тут опис зображення

  4. Доданий вигляд відображається у Вашому документі, і Ви також можете підключити там дії та посилання:

    введіть тут опис зображення


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

Перше обхідне рішення - перетягнути подання з чорної смуги назад у подання контролера перегляду, відредагувати його, а потім перетягнути назад на чорну смужку, як тільки закінчите. Це клопітно, але надійно.

Інший обхідний шлях є більш вигадливим, але я віддаю йому перевагу, оскільки він дозволяє мені одночасно бачити всі свої погляди:

  1. Перетягніть UITableView з бібліотеки об’єктів у ваш нещодавно доданий вигляд.

  2. Потім перетягніть UITableViewCell у цей UITableView.

    введіть тут опис зображення

  3. Як тільки ви це зробите, ваш погляд чарівно вискакує збоку, але у вас є UITableView, який ви не хочете. Ви можете або змінити його розмір до 0x0, або ви можете видалити його, і ваш UIView (як правило) все ще залишатиметься видимим.

  4. Іноді вторинний вигляд знову стає прихованим у IB. Ви можете повторити наведені вище кроки, якщо ви видалили UITableView, або якщо UITableView все ще знаходиться в ієрархії, вам просто потрібно натиснути на UITableViewCell, і подання знову з’явиться.

Другий метод працює для UIViews, але не так добре для панелей UIToolb, і неможливий для UIB-кнопок, тому найчистішим рішенням, яке я знайшов, коли потрібно включити безліч різних підпроектів, є приєднання одного вторинного UIView до вашого контролера перегляду як контейнера, який ніколи не відображається, помістіть туди всі свої вторинні подання та використовуйте трюк UITableViewCell, щоб зробити все видимим. Я зменшую розмір манекена UITableView до 0x0, щоб зробити його невидимим. Ось скріншот, як це все виглядає разом:

введіть тут опис зображення


Березень 2013 року, мені не потрібно було цього робити - вам слід повністю ігнорувати чорну смужку та перетягнути / опустити свій погляд безпосередньо в основний вигляд, і він працює нормально (Xcode 4.5+)
Адам,

Чи можливо повторно використовувати цей користувальницький uivew на тому ж ViewController - Якщо я колись. потрібні були два користувацьких uivews - А якщо це як?
Мортен Густафссон,

2
Боже, я вважаю за краще просто створити окремий xib. Напевно, я не пам’ятатиму все це, коли мені доведеться оновлювати програму через 6 місяців.
Сенді

Хоча це дивовижна відповідь, я випадково знайшов ще один кращий спосіб, на який я думаю. Підключивши розетки до компонентів фактичного перегляду. Якщо ви трохи наведіть на компонент такого внутрішнього вигляду - він з’явиться для легшого вибору. Тоді ви бачите це на аркуші розкадріввання ...
Одід Бен Дов

7
Хоча це неймовірно захоплююча історична відповідь, насправді вона зараз абсолютно застаріла. Apple вирішила цілу проблему, представивши "перегляди контейнерів", які зараз є центральним, основним, що ви робите під час створення додатків - все це "перегляд контейнера" ​​весь час. Слава богу, зараз це дуже просто!
Fattie,

11

Якщо ви просто хочете зробити свої контролери перегляду в іншому місці (а не на вашій дошці), то це є досить простий спосіб:

1) Створіть свої CustomViewControllers ( abcdControllerу коді, який я спробував) з їх індивідуальними xibs, як зазвичай.

2) Додайте UIViewController(або що завгодно було вашим суперкласом CustomViewController) до дошки сюжетів.

3) Встановіть для CustomClass значення CustomViewControllerзамість того, UIViewControllerяк показано тут:

введіть тут опис зображення

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
tipycal Потік

Це вирішило цю проблему для мене: stackoverflow.com/questions/11047991/… Однак, замість viewDidLoad, я використав loadView ...
Моркром,

1
Повторюю, це все (слава богу!) Абсолютно застаріле, тепер, коли тут є перегляди контейнерів. Просто клацніть на перегляді контейнера, і все готово
Fattie

1

Я думаю, ви можете зробити щось подібне, щоб отримати екземпляр конкретного контролера перегляду з Storyboard і використовувати view поверх нього.

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

Сподіваюся, це допомагає

Дякую Віджай

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.