Как использовать tableView в качестве селектора для отправки значений другому контроллеру представления?

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

В моем приложении у меня есть экран поиска, где пользователь сможет выбрать набор критериев для выполнения поиска. Некоторые из этих критериев состоят из довольно длинных списков значений для выбора, и поэтому мне нужно табличное представление на моем экране поиска, которое имеет 4 строки. Каждая строка представляет критерии, которые может установить пользователь. Как только пользователь нажимает на строку, я хочу нажать новое окно в моем навигационном контроллере, которое состоит из новой таблицы, содержащей выбираемые значения для этого критерия. Как только пользователь нажимает на одну из этих строк в новом окне, я хочу выбранное значение для отправки обратно на мой основной экран поиска и обратно на мой экран поиска.

Как лучше всего это сделать?

Уточнение:

Мой экран поиска называется SearchViewController и содержится в navigationController. SearchViewController содержит два ползунка и tableView с 4 строками, называемыми «Тип поиска», «Тип свойства», «Тип продаж», «Область» и кнопку поиска. Если пользователь нажимает «Тип поиска», я хочу, чтобы в навигационном контроллере было добавлено новое представление, которое должно содержать новый tableView с кучей строк, представляющих различные возможные значения для критериев «Тип поиска». То же самое касается всех 4 строк в SearchViewController. Когда пользователь нажимает на одну из строк значений в недавно нажатом tableView, я хочу, чтобы этот tableView был удален, а выбранное значение отправлено обратно в SearchViewController, что позволяет пользователю либо выбрать дополнительные критерии, либо нажать кнопку поиска, чтобы фактически выполнить поиск исходя из выбранных критериев.

Но я не могу понять, как лучше всего это сделать? Я очень ценю любую помощь, которую я могу получить - я схожу с ума, пытаясь понять это :)

Кстати. я не использую Interface Builder - все элементы пользовательского интерфейса кодируются вручную.

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


person Milk78    schedule 06.02.2011    source источник


Ответы (1)


5 способов сделать это здесь:

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

2) Установите для делегата UINavigationController значение Контроллер представления поиска (или любой другой класс, которым вы хотите управлять) и прослушайте событие, когда появится Контроллер представления типа поиска.

3) Реализовать функцию «обновления» в viewWillAppear: как было предложено выше, но это не рекомендуется, потому что реализация viewWillAppear: отстой и совсем не надежна. Может быть, это хорошо для простого приложения, но когда структура вашего приложения усложняется, забудьте об этом.

4) Используйте NSNotificationCenter. Ваш контроллер представления поиска будет отслеживать все изменения критериев поиска, и в каждом дочернем контроллере представления, когда пользователь изменит его, опубликует уведомление. Это сложнее, но намного мощнее и гибче, чем все вышеперечисленные методы.

5) Точно так же вы можете использовать Core Data для хранения всех критериев поиска в объекте и прослушивания изменений в этом объекте с помощью KVO. Это немного более продвинуто и может быть излишним, но если вы знаете KVO, это намного упрощает жизнь в Objective C, так что, вероятно, стоит взглянуть в любом случае.

Кстати: хорошо делать весь пользовательский интерфейс вручную, чтобы сначала понять концепции, но по возможности старайтесь переходить на интерфейсный конструктор. Это очень рекомендуемый способ работы (об этом есть бесчисленное множество тем в Stackoverflow или в Интернете с более подробными обсуждениями того, почему IB лучше).

person Enzo Tran    schedule 06.02.2011
comment
Большое спасибо - очень ценю всю помощь во время обучения :) - person Milk78; 06.02.2011
comment
У вас случайно нет нескольких ссылок на некоторые из лучших статей на тему IB и ручного пользовательского интерфейса? - person Milk78; 06.02.2011
comment
У Джеффа Ла Марке (одного из лучших блоггеров по разработке iPhone) есть хороший пост об этом: iphonedevelopment.blogspot.com/2009/10/. Но имейте в виду, что интерфейс Builder имеет очень крутую кривую обучения и может поначалу быть очень запутанным, но не сдавайтесь слишком легко. Если вы собираетесь долго заниматься разработкой для iPhone (или Mac), то это сильно окупится. - person Enzo Tran; 06.02.2011
comment
Я думаю, что IB — отличный инструмент, и его определенно стоит использовать! Должен признаться, я чувствую себя хорошо, потому что год назад все здесь, в Чехии, говорили о проблемах с производительностью IB, об увеличении сложности разработки, о том, что настоящие парни делают пользовательский интерфейс в коде и т. д. - а теперь это было показано, что это был просто фиктивный разговор ... - person joshis; 06.02.2011