Повторное использование дочерних элементов из пользовательского UIVIewController с использованием раскадровки

У меня есть раскадровка с навигационным контроллером, который ведет к UIVIewController, который я хочу использовать повторно. Этот UIVIewController имеет ParentUIViewController, который имеет все основные функции для всех UIVIewControllers, которые я повторно использую.

В настоящее время я копирую и вставляю (мех), а затем меняю класс UIViewController на ChildUIVIewController, который я хочу использовать (ChildUIViewController расширяет ParentUIViewController).

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

Я попытался создать xib для ParentViewController, но xib не загружен использует-xib-for-its-desi">потому что мне нужен xib с именем ChildViewController. Я создал его, а затем сказал, что это класс ParentViewController, но он падает в процессе.

ИЗМЕНИТЬ

Я создал пример статуса моей проблемы

https://github.com/tiagoalmeida/storyboardexample

Обратите внимание, что ParentViewController имеет более сложный набор логики, который здесь не показан. Также обратите внимание, что я также использую TableView. Я надеюсь, что это может проиллюстрировать проблему.


person Tiago Almeida    schedule 19.07.2013    source источник


Ответы (2)


Сохраните логику в parentViewController и часть пользовательского интерфейса в дочернем элементе UIViewControllers. Если вам нужно создать новый UIViewController, вы создадите дочерний элемент, который будет иметь соответствующий XIB (или избавьтесь от XIB и создайте интерфейс вручную).

person Rui Peres    schedule 19.07.2013
comment
И я должен копировать и вставлять представления для каждого ребенка? Это то же самое, что иметь их в раскадровке :/ - person Tiago Almeida; 19.07.2013
comment
Нет, если два дочерних элемента используют один и тот же пользовательский интерфейс, укажите владельца файла в качестве ParentViewController. Если два дочерних элемента используют большую часть одного и того же кода, создайте новый файл ParentViewController. Итак, у вас будет что-то вроде: childViewController : parentViewController : grandParentViewController. В этом случае grandParentViewController будет иметь то, что является общим для всех UIViewController, а новый parentViewController будет содержать логику для двух дочерних элементов. - person Rui Peres; 19.07.2013
comment
Каждый ребенок использует один и тот же пользовательский интерфейс. Итак, вы предлагаете мне создать xib для каждого ребенка и указать владельца файла в качестве ParentViewController (я указал владельца файла в качестве ChildViewController)? Я немного потерялся в вашей логике grandParentViewController. - person Tiago Almeida; 19.07.2013
comment
Так что же изменится между дочерними элементами, если они разделят пользовательский интерфейс? Немного логики? Если логика — единственное, что меняет пользовательский интерфейс, остается прежним, держите пользовательский интерфейс на parentViewController (и все, что является общим для дочерних элементов). Логика grandParentViewController заключается в том, чтобы продолжать детализировать иерархию, чтобы вы могли хранить общий код в одном месте. - person Rui Peres; 19.07.2013
comment
Это изменяет некоторую логику (например, выборка для сервера немного отличается, заголовок в представлении и т. д.). Даже со схемой, которая у меня есть (отдельные xibs), мне все равно приходится копировать и вставлять представление, потому что оно дает сбой, если в UIVIewController нет представления. Это решение кажется таким грязным: / - person Tiago Almeida; 19.07.2013
comment
Свяжитесь со мной по электронной почте, чтобы мы могли поделиться некоторыми мыслями по этому поводу. :) - person Rui Peres; 19.07.2013

Рассматривали ли вы возможность вернуться к тому же UIViewController с помощью «фантомной кнопки»?

Взгляните на это: UIStoryboard Power Drill, батарейки в комплекте

По сути, вы можете перетащить Bar Button Item в маленькую черную полосу под контроллером представления в раскадровке (1 со значками контроллера представления, первого ответчика и выхода; извините, я не помню, как это точно называется), затем вы можете контролировать + перетащите эту кнопку обратно в UIViewController для перехода к Push. Это должно создать цикл в вашей раскадровке. Все, что вам нужно сделать дальше, это дать этому переходу идентификатор, программно вызвать его из вашего кода с помощью [self performSegueWithIdentifier:], затем реализовать -(void)prepareForSegue: и использовать [segue destinationViewController] для условной установки заголовка и, возможно, некоторых флагов, чтобы вы могли определить, когда использовать различные виды выборки (или другие варианты кода) в том же коде класса.

person Yazid    schedule 19.07.2013
comment
Это интересно, спасибо за пост. Однако я считаю, что код легче понять, если я разделю его в иерархии классов. Однако это возможный подход, и, возможно, я воспользуюсь им, если не найду лучшего решения. - person Tiago Almeida; 19.07.2013