UINavigationController visibleViewControllers - PullRequest
       10

UINavigationController visibleViewControllers

2 голосов
/ 03 октября 2011

У меня есть UITabBarController, и одна вкладка - UINavigationController. У меня есть панель поиска, которая переходит в определенный вид в UINavigationController. Проблема в том, что если UINavigationController не выдвигает первое представление, то происходит сбой, поскольку мой поиск не распознает visibleViewController из этого вызова:

UINavigationController *navController = [self.MainTab.viewControllers objectAtIndex:1];
FirstViewController *fVC = [navController visibleViewController];

Что я не понимаю, перед этим кодом я делаю так:

    self.MainTab.selectedIndex = 1;

Этот код сам выбирает viewController на той вкладке, где представление загружается, насколько мне известно. Так не должно ли этого быть достаточно для [navController visibleViewController], чтобы получить текущий viewController? Спасибо.

Ответы [ 3 ]

5 голосов
/ 03 октября 2011

Попробуйте topViewController вместо visibleViewController .

FirstViewController *fVC = [navController topViewController];
1 голос
/ 03 октября 2011

Из того, что вы объясняете в своем вопросе и комментариях, я понимаю, что ваш код пытается получить доступ к объекту типа FirstViewController, предположительно, к первому представлению, которое будет добавлено к вашему UINavigationController, когда он еще не создан.

С другой стороны, если вы сначала программно выберите вкладку, представление будет создано, и все будет работать нормально.Действительно, это представление создается с помощью метода viewDidLoad, который запускается при выборе вкладки.

Я хотел бы предложить решение, позволяющее избежать доступа к UINavigationController visibleViewController непосредственно с вкладки поиска;вместо этого позвольте вашему поисковому коду обратиться к модели (как в Model-View-Controller) для вашего приложения и сохранить там результат;затем из упомянутого метода viewDidLoad снова получите доступ к модели, чтобы прочитать результат поиска и обновить / показать пользовательский интерфейс.

Это решение clean , IMO.Если вы хотите что-то вроде обходного пути к вашему текущему дизайну, то проверьте значение fVC, которое вы получили от visibleViewController, и если оно не соответствует ожидаемому, то создайте экземпляр представления должным образом.

Надеюсь, это поможет.

0 голосов
/ 25 февраля 2013

Я знаю, что на это ответили, но я нашел другое решение, которое могло бы быть полезным.В моем случае я обрабатывал вращение по-разному для некоторых viewControllers в моем NavigationController. Я сделал следующее:

Подкласс UINavigationController, затем при необходимости в новом подклассе вы можете получить доступ к заголовку текущего visibleViewController, например, так:1004 *

Это не относится к ротации, это то, для чего я его использовал.Единственное, что вам нужно сделать, это установить self.title для каждого из контроллеров viewController, с которыми вы проверяете их viewDidLoad, если они установлены в IB или не установлены, они будут nil.

...