Доберитесь до контроллера представления, который выдвинул видимый контроллер представления - PullRequest
8 голосов
/ 06 июля 2010

У меня есть приложение с UINavigationController, которое выдвигает 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 хранит массив всех VC в стеке навигации, поэтому индекс, видимый в данный момент, минус один должен указывать на VC, которыйподтолкнул в настоящее время видимый VC в поле зрения.Скорее, это, кажется, указывает на мой UITabBarController:

-[UITabBarController rateCurrentEvent:]: unrecognized selector sent to instance

Что случилось с этим и, что более важно, как мне получить указатель на VC, который выдвинул на экран текущий видимый VC?

РЕДАКТИРОВАТЬ: я закончил тем, что создал протокол делегата для EventRatingAddViewController и назначил EventInformationViewController в качестве делегата.Это работает хорошо - все же я думаю, что должен быть способ получить доступ к толкающему ВК через стек навигации.

1 Ответ

6 голосов
/ 06 июля 2010

Я почти уверен, что 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:)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...