Ios 如何从一个选项卡切换到另一个选项卡并返回?

Ios 如何从一个选项卡切换到另一个选项卡并返回?,ios,xcode,uinavigationcontroller,interface-builder,uitabbarcontroller,Ios,Xcode,Uinavigationcontroller,Interface Builder,Uitabbarcontroller,我在浏览我的视图时遇到了一个小问题。 以下是我的配置: 我有一个Tabbar控制器,在导航控制器中嵌入了2个关系序列和2个简单视图。 现在,我想从视图控制器1导航到视图控制器3,还想在选项卡栏中显示所选的正确选项卡。如果我来自视图控制器1,我还希望后退按钮将我重定向到上一个选项卡。我尝试了在视图之间连接segue的方法,但如果我这样做,它只会将视图控制器推到导航堆栈上,而不会更改选项卡。所以我现在的问题是,管理这个问题的最好方法是什么 截图: 这里有一个方法。但我发布这篇文章是为了说明为什么你不

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

截图:


这里有一个方法。但我发布这篇文章是为了说明为什么你不应该这么做

  • 我使用VC2和VC3的视图标记属性来传递导航数据,这具有紧密耦合所有三个对象的效果
  • 我覆盖VC1->VC3上下文的返回栏按钮。你失去了连贯性
  • VC3->VC2提供反向动画。VC3->VC1从一个选项卡翻转到另一个选项卡时没有动画。更不一致
  • VC1->VC3,点击选项卡项2,转换为VC2。用户界面混乱
无论如何,如果你还想这么做。。。 .

视图控制器1
有一个“跳到VC3”按钮,连接到跳到VC3:

 //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,这将正确设置“后退”按钮。如果将其他视图控制器添加到此堆栈,则此导航将中断

视图控制器2
有一个“移动到VC3”按钮,连接到故事板序列到VC3“到VC3”

视图控制器3
如果其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

这里有一个方法。但我发布这篇文章是为了说明为什么你不应该这么做

  • 我使用VC2和VC3的视图标记属性来传递导航数据,这具有紧密耦合所有三个对象的效果
  • 我覆盖VC1->VC3上下文的返回栏按钮。你失去了连贯性
  • VC3->VC2提供反向动画。VC3->VC1从一个选项卡翻转到另一个选项卡时没有动画。更不一致
  • VC1->VC3,点击选项卡项2,转换为VC2。用户界面混乱
无论如何,如果你还想这么做。。。 .

视图控制器1
有一个“跳到VC3”按钮,连接到跳到VC3:

 //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,这将正确设置“后退”按钮。如果将其他视图控制器添加到此堆栈,则此导航将中断

视图控制器2
有一个“移动到VC3”按钮,连接到故事板序列到VC3“到VC3”

视图控制器3
如果其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