1

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

截图的最佳方式:

enter image description here

回答

1

这里有一个办法做到这一点。但我发布这真的说明你为什么不应该做到这一点。

  • 我使用VC2和VC3的视图标签属性来传递导航数据,它具有紧密耦合所有三个对象的效果。
  • 我覆盖VC1-> VC3上下文的back bar按钮。你失去一致性。
  • VC3-> VC2提供后退动画。 VC3-> VC1从一个选项卡翻转到另一个选项卡时没有动画。更多不一致
  • VC1-> VC3,点击Tab Item 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”切换我们选项卡,并设置最前面的视图的视图标签属性设置为1 IF最前面的视图是VC2,这会立即触发VC3。如果最前面的视图是VC3,则会正确设置后退按钮。如果其他视图控制器被添加到此堆栈,则此导航将会中断。

ViewController2
有着 “移动到VC3” 按钮,有线到故事板顺着接下去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 
相关问题