UINavigationController中按下后退按钮的自定义逻辑

时间:2012-04-21 02:47:34

标签: ios

我的应用程序布局的更详细说明:单击表格视图的任何行将使用户进入下一个屏幕,其中后退按钮指向主页,顶部是分段控件。代码中的逻辑确定将预先选择分段控件的哪个段。用户可以单击分段控件的任何索引来更改屏幕上显示的内容。

我实现上述布局的方式是通过导航控制器。每页的内容对应于“第一,第二和第二”。第三个“分段控件”都是独立的视图控制器。我之所以这样,是因为每个页面都有重要的功能和控件供用户进行交互。将它们作为一个单独的视图控制器保存,有助于软件代码组织和数据完整性。主屏幕位于导航控制器堆栈的索引零点,视图控制器对应于导航控制器索引之一处的第一个等等。假设用户当前位于第二个屏幕上,并且在第二个屏幕上选择了“第一个”分段控制。如果用户现在点击“第三”,则两个视图控制器被推入堆栈,反之亦然,以便将控制器弹出导航堆栈。

两个问题:     •对我实施方式的任何评论?是否有任何更好的实施建议?我考虑过的一个具体实现是有一个视图控制器有三个独立视图(一个用于第一个,第二个和第三个)的可能性?对这种方法有何评论?

•   I seem to have an extremely hard time controlling the behavior of the “back button”of the navigation controller. When the user has selected “second”in the segmented control, I would still like to have the back button saying “Home” instead of “first” which is the default behavior of the navigation controller. I have figured out how I can customize the text of the back button. However, I can't seem to figure out how to customize the behavior of the button. What I mean by that is, when the user is on "third”, and clicks on the “home button”I'd like to pop three view controllers and land the user on the home screen.

在SO上,我看到并尝试了各种技术但没有成功: 方法1:viewwillDisappear():确定此函数是否作为后退按钮按下的一部分被调用,并实现弹出超出标准的一个视图控制器弹出窗口的其他视图控制器的逻辑。有一会儿,这个逻辑确实弹回到主页,但是它立即崩溃了以下消息,我似乎不明白:

方法2:didPopItem():我将以下代码放在此函数中

- (void)navigationBar:(UINavigationBar *)navigationBar didPopItem:(UINavigationItem *)item {

   NSLog(@"%s",__FUNCTION__);
      [[self navigationController] popViewControllerAnimated:YES];
    //ViewControllerAnimated:YES];
   NSLog(@"navcount%d",self.navigationController.viewControllers.count);
   if (self.navigationController.viewControllers.count > 1) {
         [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
   }

}

对上述任何评论都将不胜感激!在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于视图层次结构中三个视图控制器实际上彼此相同,因此我建议您更换顶视图控制器,而不是在段之间切换时推送多个视图控制器,以便您可以从任何一个中“返回”三个视图控制器,您将最终到达您想要的位置。

这样的事情对你有用:

- (void)replaceTopViewControllerWith:(UIViewController *)vc {
    NSMutableArray *vcs = [[self.navigationController viewControllers] mutableCopy];
    [vcs removeLastObject];
    [vcs addObject:vc];
    [self.navigationController setViewControllers:vcs animated:YES];
}