Как использовать tableView в качестве селектора для отправки значений в другой viewcontroller? - PullRequest
1 голос
/ 06 февраля 2011

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

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

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

Разработка:

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

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

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

enter image description here

1 Ответ

3 голосов
/ 06 февраля 2011

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

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

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

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

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

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

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

...