2015-01-09 81 views
1

Я пытаюсь разработать контроллер представления таблиц (с контроллером навигации), где строки подключены к нескольким контроллерам просмотра (TextField, TextView, TableView, DatePicker, ImageView и т. Д.).Container View with multiple child views issue

Таким образом, я проектирую, как если бы я нажимал на любую строку, он должен был открыть один UIViewController having container view, а затем поместить соответствующий контроллер в контейнер. В том же типе табличных представлений используется тот же контроллер вида, что и дочерний вид контейнер.

Я могу поставить правильную view controller (пример - 1.TextViewController для Text View 2. Table View Controller для просмотра Таблица 3. DatePickerController для выбора даты.) В контейнере зависит от их типа строки.

Но я немного путаюсь о том, как выбрать данные из детского вида, когда я нажимаю done button (второй экран справа). Для дочернего текстового поля мне нужно выбрать входные данные, которые я ввожу в поле ввода. Для дочернего вида «Таблица» я скрываю кнопку «Готово», поэтому, как только пользователь выбирает данные, «cellForRowAtIndexPath» должен загореться и передать пропущенные данные.

Как это сделать? где написать это? Есть ли другой способ спроектировать это?

enter image description here

+0

пойти делегации. –

+0

@ Сухая, пожалуйста, уточните? – Nullify

ответ

2

Как @Suhail упоминалось, что лучший способ сделать это, в общем, если вы хотите, чтобы передать данные из контроллера зрения ребенка к контроллеру зрения родителя, или в некоторых случаях от контроллера к предыдущему отображается контроллеры (которые все еще находятся в стеке), используют шаблон delegate. Вы можете реализовать шаблон делегирования с протоколами iOS или с блоками. На мой взгляд, оба подхода имеют свои плюсы и минусы, поскольку для этой темы вам придется немного больше искать Google, поскольку это не место для обсуждения.

Давайте определим некоторые случаи для вашего дела (не во всех случаях):

  1. Вы хотите отправить данные из ChildTableViewControler в Field контроллера (экран 3 на экран 2)

    В этом случае, из того, что я понял, оба контроллера встроены в родительский контроллер, поэтому вам нужно установить родительский элемент в качестве делегата для двух дочерних контроллеров. Вам необходимо создать один или два протокола в зависимости от ваших действий или данных, которые вы хотите отправить контроллерам. Создайте свойство под названием delegate (вы можете выбрать свое имя) для каждого из дочерних элементов, реализуйте методы на родительском контроллере представления, когда вы добавляете одного из дочерних элементов на экране, установите для свойства delegate родительский контроллер представления. Теперь, когда вы хотите отправить данные другому ребенку, вам нужно вызвать методы, объявленные в ваших протоколах. Помните, что у вас есть доступ от родителя к обоим детям через childViewControllers.

    Краткая версия: Один/два протокола для детей, родительский протокол (ы) и отвечает за действие ребенка.

  2. Вы хотите отправить данные из Filed в TableViewController (с экрана 2 на экран 1)

    В этом случае вы объявляете протокол в контроллере родительского вида, который будет реализован в TableViewController .Declare a delegate (или любое другое имя, которое вам нравится) в родительском контроллере представления.Когда вы добавляете на экран контроллер Filed, вы устанавливаете delegate свойство TableViewController. Теперь вы можете общаться с TableViewController от контроллера Field через delegate.

    Краткая версия: один протокол в контроллере родительского представления, TableViewController реализует протокол и отвечает на действия TableViewController.

  3. Вы хотите отправить данные от ChildTableViewController до TableViewController (экран 3 на экран 1). Это же, как и случае 2.

Один из моих правило, когда я отправить данные из контроллеров зрения что-то вроде этого: если я хочу, чтобы отправить данные вперед (на следующий экран, который будет отображаться), то Я использую свойство/методы. Если я хочу отправить данные назад (ранее отображаемым контроллерам), я использую делегат/блоки.

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

Немного не по теме, если читатель моего ответа является 9gagger то «извините за длинный пост, вот картошка»