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

标签 ios xcode uinavigationcontroller interface-builder uitabbarcontroller

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

截图:

enter image description here

最佳答案

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

  • 我正在使用 VC2 和 VC3 的 View 标记属性来传递导航数据,这具有紧密耦合所有三个对象的效果。
  • 我覆盖了 VC1->VC3 上下文的后退栏按钮。你失去了一致性。
  • VC3->VC2 提供后退动画。 VC3->VC1 没有动画,因为它从一个选项卡翻转到另一个选项卡。更多的不一致
  • VC1->VC3,点击选项卡项目 2 转换为 VC2。用户界面困惑。

无论如何,如果您仍然想这样做... .

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 并将最前面的 View 的 View 标记属性设置为 1。如果最前面的 View 是 VC2,这会立即触发到 VC3 的转场。如果最前面的 View 是 VC3,这将正确设置后退按钮。如果将其他 View Controller 添加到此堆栈,此导航将中断。

ViewController2
有一个“移动到 VC3”按钮,连接到 Storyboard 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

关于ios - 如何从一个选项卡切换到另一个选项卡并返回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14381148/

相关文章:

iphone - 尝试在NSUserDefaults中保存索引路径时出现错误

javascript - UA PhoneGap 2.0 插件在 iOS 上无法正确初始化

swift - 我该如何正确使用这个Github项目呢?

ios - 什么是 .a(如 libcrypto.a)文件?

ios - 如何通过 Storyboard 将后退按钮添加到导航栏?

ios - VoIP 推送不适用于 iOS SDK 演示

iphone - 在 iOS6-7 中当设备处于横向或反之时推送纵向 View

用于“查找任何内容”的 Xcode 键盘快捷键

ios - 弹出到非大半透明栏时 UINavigationBar 大标题问题

iphone - 设置独立于 TabBar 标题的 NavController 标题