повторно использовать вид из раскадровки - PullRequest
6 голосов
/ 19 декабря 2011

У меня есть таблица с пользовательскими заголовками разделов.Представление для заголовка раздела определено в раскадровке и связано с переменной экземпляра.Есть ли способ запросить новый экземпляр представления из раскадровки?

В прошлом я делал это, определяя заголовок раздела в своем собственном файле xib и получая новый экземпляр с помощью

[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil];
UIView *newHeaderView = self.sectionHeaderView;

Ответы [ 6 ]

3 голосов
/ 20 апреля 2012

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

UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"IdentifierName"];

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

3 голосов
/ 19 апреля 2012

Решение, которое я придумал для этого, заключается в следующем:

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

Это первое табличное представление имеет кнопку поиска, которая отображает новое табличное представление с результатами. Он нуждается в той же функциональности, что и основной стол, который его толкает; включая переходы к подробным представлениям и представлениям хода выполнения транзакции так:

На раскадровке выберите и скопируйте ваш основной просмотр таблицы. Отмените выбор и вставьте. Создайте толчок от вашего основного представления к вашему второму представлению; или откуда вы хотите перейти к нему. Измените 2-й вид таблицы, как вам нравится. IE: Если это требует каких-либо изменений пользовательского интерфейса, не проблема.

Создайте новый класс viewcontroller, который является подклассом viewcontroller, выполняющего основной просмотр таблицы.

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

Вернувшись в раскадровку, выберите второй контроллер таблиц и в инспекторе идентичности выберите свой подкласс в качестве пользовательского класса.

Чтобы это решение работало гладко, вашему приложению действительно необходимо управлять данными для представлений. Вы могли бы использовать prepareforsegue для передачи данных из первого представления таблицы во второе, но я обнаружил, что модель данных приложения гораздо более гибкая с многочисленных точек зрения.

Если у вас нет кнопок, которые нажимают на подвиги через segue, ваш подкласс должен будет переопределить функции, которые проталкивают через segues с идентификаторами. Примечание. У сегментов должны быть уникальные идентификаторы, если вы вообще их идентифицируете.

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

3 голосов
/ 21 декабря 2011

Я пытался сделать то же самое и столкнулся с той же проблемой.

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

Затем вы можете поместить универсальный UIView во все места, куда должен идти ваш повторно используемый вид, и добавить его, используя ваш ViewController:

[myReusableViewController loadView];
[myReusableViewController viewDidLoad]; // You have to handle view callbacks yourself.

[self.myReusableViewPlaceholder addSubview:myResusableViewController.view];
[myReusableViewController viewWillAppear:YES];

Итак, подведем итог:

  • Используйте раскадровку, это здорово
  • Создайте каркас вашего приложения в раскадровке вместе с любым статическим представлением (например, об экранах и т. Д.)
  • Создайте повторно используемые представления в пользовательском nib + UIViewController подклассе и добавьте UIView заполнители в раскадровку.

В другом ответе я подумал о некоторых за и против раскадровки

3 голосов
/ 19 декабря 2011

Я не думаю, что есть способ сделать это. Лучше всего помещать пользовательский вид заголовка таблицы в отдельный кончик и загружать его, как вы делали это в своем примере кода, когда вам нужно его использовать.

0 голосов
/ 08 июля 2019

Например: мы хотим повторно использовать представление (включая подпредставления) в раскадровке, показанной ниже.

The target view in storyboard we want to reuse

Лучшее из известных мне решений - это обрезать и вставить код, относящийся к представлению, в файл New Singe View без потери информации.

Подробные шаги:

Шаг 1. Переименуйте представление, которое мы хотим использовать повторно. Просто подготовьтесь к шагу 2.

step 1

Шаг 2. Откройте раскадровку в качестве исходного кода, чтобы обрезать нужный нам XML-код

step 2

Шаг 3、4: Найдите и скопируйте нужный нам код

step 3

step 4

Шаг 4.5 (не требуется): откройте как Interface Builder, чтобы увидеть удаленное представление

step 4.5

Шаг 5、6: Новый XXX.xib и вставьте код, который мы только что обрезали

step 5

step 6

Шаг 7: Важно. Вставьте код <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> в исходный код XXX.xib. Предупреждение: сделайте это прежде, чем открыть его как Interface Builder! В противном случае вы увидите неправильный размер и разметку.

[! [Шаг 7] [9]] [9]

Шаг 8: Новый XXX.swift для подключения XXX.xib

[! [Шаг 8] [10]] [10]

Шаг 9: добавьте представление в любое удобное для вас место

[! [Шаг 9] [11]] [11]

Я получаю предупреждение: «Вам нужно как минимум 10 репутаций, чтобы разместить более 8 ссылок». Можете ли вы поддержать меня, чтобы загрузить оставшиеся 3 скриншота?

0 голосов
/ 19 декабря 2011

Мне удалось повторно использовать представление в раскадровке, просто соединив переход из одного табличного представления в одно, которое я хочу использовать повторно.

, поэтому мое табличное представление, которое я хочу использовать повторно, указано дважды.Это вроде работает, но проблема, с которой я сталкиваюсь, заключается в установке переменной (используя instantiateViewControllerWithIdentifier) ​​в моем делегате приложения для моего табличного представления, которое снова используется.Кажется, что если я снова его использую, раскадровка создает 2 экземпляра моего табличного представления, и тот, который я получаю с instantiateViewControllerWithIdentifier, не тот, который я хочу.сделать это.Но я предполагаю, что многие другие так или иначе делают это.Я подозреваю, что с настраиваемыми ячейками таблицы в раскадровке многие люди хотят повторно использовать свои представления.

...