如何从一个标签切换到另一个标签并返回?

时间:2013-01-17 14:23:40

标签: ios xcode uinavigationcontroller interface-builder uitabbarcontroller

我在浏览视图时遇到了一些问题。 这是我的配置: 我有一个Tabbar控制器,有2个关系segues到2个嵌入在导航控制器内的简单视图。 现在我想从视图控制器1导航到视图控制器3,我还想显示在标签栏中选择的正确选项卡。如果我来自视图控制器1,我还希望后退按钮将我重定向到上一个选项卡。我尝试了在视图之间连接了segue的东西,但如果我这样做,它只是将视图控制器推到导航堆栈上,但不会更改选项卡。所以现在我的问题是,管理这个问题的最佳方法是什么

截图:

enter image description here

1 个答案:

答案 0 :(得分:1)

这是一种方法。但我发布这个真的是为了说明为什么你不应该这样做。

  • 我正在使用VC2和VC3的视图标记属性来传递导航数据,这会产生紧密耦合所有三个对象的效果。
  • 我覆盖了VC1-> VC3上下文的后退按钮。你失去了一致性。
  • VC3-> VC2提供回动画。 VC3-> VC1没有动画,因为它从一个标签翻转到另一个标签。更多不一致
  • VC1-> VC3,点击标签项目2转换为VC2。 UI混乱。

无论如何,如果想要这样做......  。

<强> ViewController1
有一个“跳转到VC3”按钮,连接到jumpToVC3:

 //ViewController1.m

#import "ViewController1.h"

@implementation ViewController1

- (IBAction)jumpToVC3:(id)sender {
    NSArray* viewArray = [[[self.tabBarController viewControllers] objectAtIndex:1] viewControllers];
    [[[viewArray lastObject] view] setTag:1];
    [self.tabBarController setSelectedIndex:1];
}
@end

“jumptToVC3”将我们切换到选项卡2并将最前面视图的视图标记属性设置为1.如果最前面的视图是VC2,则触发立即转换到VC3。如果最前面的视图是VC3,则会正确设置后退按钮。如果其他视图控制器被添加到此堆栈,则此导航将中断。

<强> ViewController2
有一个“移动到VC3”按钮,连接到故事板segue到VC3“toVC3”

    //  ViewController2.m

#import "ViewController2.h"
#import "ViewController3.h"

@implementation ViewController2

    //we use the view.tag property as a switch:
    //0 = do nothing
    //1 = segue to VC3
    //2 = go to tab 0  

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (self.view.tag ==1){
        [self performSegueWithIdentifier:@"toVC3" sender:self];
    } else if (self.view.tag == 2){
        [self.tabBarController setSelectedIndex:0];
    }
    self.view.tag = 0;
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if (self.view.tag ==1) {
        [[segue.destinationViewController view] setTag:1];
    } else {
        [[segue.destinationViewController view] setTag:0];
    }
    self.view.tag = 0;
}

- (void) viewWillDisappear:(BOOL)animated
{
    self.view.tag = 0;
}

@end

<强> ViewController3
如果view.tag设置为1,则覆盖后退按钮。如果希望两个上下文的后退按钮保持一致,则还需要覆盖默认行为。您将无法获得标准后退按钮查找此覆盖行为。

    //  ViewController3.m

#import "ViewController3.h"

@implementation ViewController3

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (self.view.tag == 1) {
        self.navigationItem.leftBarButtonItem =
        [[UIBarButtonItem alloc] initWithTitle:@"0.0"
                                         style:UIBarButtonItemStyleBordered
                                        target:self
                                        action:@selector(goBack:)];
    }
    self.view.tag = 0;
}

- (IBAction)goBack:(id)sender {
    [[[[self.navigationController viewControllers]
       objectAtIndex:0] view] setTag:2];
        [self.navigationController popToRootViewControllerAnimated:YES];
}
@end