到达推出当前可见视图控制器的视图控制器

8
我有一个应用程序,其中包含一个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推入视图的VC。然而,它似乎指向了我的UITabBarController

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

这是怎么回事,更重要的是,我如何获得推送当前可见VC的VC的指针?

编辑:最终我创建了一个委托协议用于EventRatingAddViewController,并将EventInformationViewController分配为委托。这个方法很有效 - 尽管我认为应该有一种通过导航栈访问推送VC的方法。


1
不是回答你的问题,但你应该使用.topViewController而不是.visibleViewController,因为后者可能是一个模态呈现的视图控制器,与你的导航控制器栈无关! - Douwe Maan
你试过打印 myIndex 和你获取的UITabBarController的索引吗? - Douwe Maan
关于 topViewController 的说法很好。由于我的应用程序中没有模态视图控制器,所以这在这种情况下并没有影响。可见的视图控制器得到索引 2,UITabBarController 得到索引 1。 - mvexel
1
为什么只有一个选项卡,你要显示选项卡控制器吗?为什么不直接将视图控制器推入堆栈或以模态方式呈现? - rickharrison
@rickharrisson -> UITabBarController有四个选项卡,只有考虑的这一个具有将新VC推入堆栈的VC。 - mvexel
编辑了问题以明确UITabBarController具有比正在考虑的选项卡更多的选项卡。 - mvexel
1个回答

6
我很确信,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:)];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接