У меня есть приложение, которое имеет a UINavigationController
это продвигает a UITabBarController
в представление. Это UITabBarController
имеет четыре вкладки, одна из которых показывает пользовательское UIViewController
, экземпляр EventInformationViewController
. Кнопка в этом пользовательском контроллере представления в свою очередь продвигает другой пользовательский контроллер представления EventRatingAddViewController
в представление. Действие в этом контроллере представления должно вызвать метод в EventInformationViewController
экземпляр. Следующий код делает сбой приложения вместо этого:
// get the index of the visible VC on the stack
int myIindex = [self.navigationController.viewControllers indexOfObject:self.navigationController.visibleViewController];
// get a reference to the previous VC
EventInformationViewController *prevVC = (EventInformationViewController *)[self.navigationController.viewControllers objectAtIndex:myIindex - 1];
[prevVC performSelector:@selector(rateCurrentEvent:)];
Я думал, что viewControllers свойство сохранило массив всего VCS на стопке навигации, таким образом, индекс в настоящее время видимый минус нужно указать на VC, который продвинул в настоящее время видимый VC в представление. Скорее это, кажется, указывает на мой UITabBarController
:
-[UITabBarController rateCurrentEvent:]: unrecognized selector sent to instance
Что произошло с этим и что еще более важно, как я получаю указатель на VC, который продвигал в настоящее время visisble VC в представление?
Править: Я закончил тем, что создал протокол делегата для EventRatingAddViewController
и присвоение EventInformationViewController
как делегат. Это работает хорошо - все еще я думаю, что должен быть способ получить доступ к продвижению VC через стопку навигации.
Я почти уверен, что UITabBarController
действительно нажмите на текущий контроллер представления, но то, что вы ищете, - это контроллер представления одной из вкладок UITabBarController
, контроллер представления, который был виден в UITabBarController
в то время этот UITabBarController
поместил ваш контроллер представления в стек навигации. Возможно, этот UITabBarController
поместил ваш контроллер представления в стек, потому что это было сказано ему контроллером представления видимой вкладки, поэтому это будет примерно так: [self.tabBarController.navigationController pushViewController: someViewController];
.
Чтобы узнать, какой контроллер представления был показан в UITabBarController
в то время, когда ваш контроллер представления был помещен в стек, необходимо использовать свойство .selectedViewController
, чтобы приведет к примерно такому результату:
// get the index of the visible VC on the stack
int currentVCIndex = [self.navigationController.viewControllers indexOfObject:self.navigationController.topViewController];
// get a reference to the previous VC
UITabBarController *prevVC = (UITabBarController *)[self.navigationController.viewControllers objectAtIndex:currentVCIndex - 1];
// get the VC shown by the previous VC
EventInformationViewController *prevShownVC = (EventInformationViewController *)prevVC.selectedViewController;
[prevShownVC performSelector:@selector(rateCurrentEvent:)];