2009-07-02 4 views
7

Есть ли способ для UIViewController (внутри стека навигации) определить, появляется ли это из-за того, что выполняется сверление или сверление?UIViewController: обнаружение детализации и детализации

В представленииWillAppear, topViewController и визуальный контроль UINavigationController уже установлены на новый ViewController, к сожалению.

+0

Я тоже борюсь с этим. Я надеялся создать класс-помощник и сделать его своим «стек» UINavigationControllerDelegate, а затем посмотрев через «navigationController: willShowViewController:», но есть две проблемы: 1), кажется, вызывается даже тогда, когда его не нажимают (например, табуляция по этому стеклу - что кажется подозрительным), и 2) это называется ПОСЛЕ того, что связано с контроллером viewWillAppear, что вызывает логические проблемы для меня, так как мне нужно знать, находится ли я в том же стеке до появления представления. Я просто указываю на это, потому что этот подход казался элегантным, но был тупиком. –

ответ

0

Не могли бы вы взглянуть на свойство viewControllers в контроллере навигации?

+1

Боюсь, нет. Текущий контроллер будет всегда последним элементом массива. Не может ли быть обнаружено это событие в результате того, что он был запущен или какой-либо другой контроллер не был обнаружен. :( – Norman

5

Вы можете подклассифицировать UINavigationController и добавить объект didPushViewController. Затем вы можете переопределить pushViewController и popViewController, чтобы правильно установить свойство в true или false соответственно.

+0

Звучит неплохо. Я просто подумал, что есть более простой способ, которого я забыл. Спасибо. – Norman

1

Вам просто нужно знать, что будет с предыдущими и последующими контроллерами? Или вам нужно конкретно знать, был ли выведен или нажат контроллер вида? Вы можете реализовать следующий метод, который определяется UINavigationControllerDelegate:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    UIViewController * currentController = navigationController.visibleViewController; 
    UIViewController * nextController = viewController; 

    // Do whatever here. 
} 

Если, однако, вы должны знать, был ли совал или толкания конкретный контроллер представления, то предложение Мэтта Бриджеса это путь.

2

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

Не забудьте выпустить и проигнорировать ссылки в viewWillAppear, чтобы система была сброшена, чтобы снова распознать вещи.

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