Есть ли способ лучше?Делегат -> Делегат -> Делегат - PullRequest
7 голосов
/ 15 марта 2011

У меня есть вид, который загружает вид, который должен выдвинуть вид на главный контроллер навигации.

Я настроил делегата для каждого представления и в основном выполняю свой обратный вызов по «цепочке» на главном навигационном контроллере.

Это работает, но мне интересно, есть ли лучший (более легкий?) Способ добиться этого?

Ответы [ 3 ]

7 голосов
/ 15 марта 2011

Вы можете использовать NSNotificationCenter , чтобы отправить сообщение, на которое ваш NavigationController ответит.

По вашему мнению, для вызова NavigationController вы должны написать что-то вроде:

[[NSNotificationCenter defaultCenter] postNotificationName:@"DoWork" object:nil];

Где @"DoWork" - уникальное (наиболее вероятное) имя сообщения, на которое будет реагировать другой объект.

И в вашем NavigationController вам необходимо добавить наблюдателя, чтобы иметь возможность перехватить это уведомление, например так:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doWork) name:@"DoWork" object:nil];

Где @selector(doWork) - это селектор, который вы хотите выполнить при публикации уведомления, а @"DoWork" - это уведомление, на которое вы хотите ответить.

2 голосов
/ 15 марта 2011

Итак, представление A загружает представление B. Позже представление B загружает представление C и хочет перенести свой контроллер вида на контроллер навигации выше по потоку от представлений B?Посмотреть, как?контроллер представления.

При условии, что представление B имеет контроллер представления, который является частью стека навигации, тогда его контроллер представления может захватить контроллер навигации, независимо от того, как далеко он находится в стеке, через [self navigationController].

Представления не имеют указателя на свой контроллер, но если вы хотите полностью отключить MVC, вы можете установить контроллер самостоятельно.Лучшим подходом было бы, чтобы контроллер получил действие касания (или что-то еще, что вызывает загрузку и нажатие на представление C), а затем контроллер представления обрабатывал обмен.Например, если представление B является табличным представлением, вы должны установить его контроллер представления как UITableViewDelegate, чтобы он мог обрабатывать выбор строки путем нажатия на новый контроллер представления.

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

0 голосов
/ 15 марта 2011

В зависимости от того, как вы настроили свою программу, если ваш делегат приложения содержит UINavigationController, вы можете получить доступ к навигационному контроллеру из любого места:

[[[NSApp delegate] navigationController] pushViewController: myVC animated:YES];

Но опять же, это работает, только если ваш делегат приложения содержит UINavigationController.

...