Interface Builder IB - 导航控制器,跳过视图

时间:2013-04-12 15:16:00

标签: ios uinavigationcontroller interface-builder

您好我是iOS的新手,对于浏览我的观点有疑问。

我正在使用IB连接导航栏中的PREVIOUS和NEXT按钮来推送我的视图。一切正常。但是我无法找到我需要做什么或者我需要放置代码的位置,以便我可以跳过视图。为了简化我的情况......

- 我有1个Nav控制器和4个名为VC1,VC2,VC3,VC4的视图控制器。每个VC都有一个.H / .M - 从VC1开始,他们一个接一个地跟着。

假设我想跳过VC3并根据VC2中的设置直接跳转到VC4。我会把代码放在哪里?我是否需要从VC3的NAV按钮取消IBAction方法?

如果之前已经介绍过,我会道歉。如果有啧啧或者您知道有回复此帖的帖子,请告诉我。我确实进行了搜索,但搜索返回了通用帖子,可能是因为我使用了错误的术语。

提前致谢。

2 个答案:

答案 0 :(得分:1)

有几点想法:

  1. 如果你想从VC2推送到VC​​3或VC4,而不是让VC3在特殊情况下立即推送到VC​​4,我认为将VC2直接推送到适当的视图控制器会更好。因此,VC2中可能有IBAction可以为您执行此操作:

    - (IBAction)pushToNext:(id)sender
    {
        BOOL skipToVC4 = ... // put in whatever logic you'd use to bypass VC3 and go directly to VC4
        UIViewController *nextController;
    
        if (skipToVC4)
        {
            nextController = [self.storyboard instantiateViewControllerWithIdentifier:@"VC4"];
    
            // obviously, if using NIBs, you'd do something like:
            // nextController = [[ViewController4 alloc] initWithNibName:@"VC4" bundle:nil];
        }
        else
        {
            nextController = [self.storyboard instantiateViewControllerWithIdentifier:@"VC3"];
        }
    
        [self.navigationController pushViewController:nextController animated:YES];
    }
    

    这样,当你从VC4弹出时,你会直接回到相应的视图控制器(例如,如果你从VC2推送到VC​​4,当你弹出时,你会自动弹回到VC2。

    显然,如果您使用的是故事板,而不是手动调用pushViewController,您可以从VC2获得两个segue(一个到VC3,一个到VC4),给它们适当的标识符,然后只需调用performSegueWithIdentifier转到相应的视图控制器。但是这个想法是一样的:你可以定义一个IBAction来执行适当的segue,具体取决于你选择的逻辑。

  2. 你说你的导航栏中有“PREVIOUS和NEXT按钮推送我的视图”,我想知道你的“PREVIOUS”按钮。这是popViewControllerAnimated吗?通常,“NEXT”按钮将推送到新的视图控制器,但“PREVIOUS”按钮不应该推到上一个视图,而是弹回到它。如果不弹回,则最终可能会出现一些先前视图控制器的多个实例。因此,“PREVIOUS”按钮应链接到IBOutlet,其执行类似:

    - (IBAction)popToPrevious:(id)sender
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    
  3. 当弹回时,您显然会弹回到您推送的视图控制器。如果您想要在6.0之前的iOS版本中弹回一些视图控制器,则可以使用popToViewControllerpopToRootViewControllerAnimated。例如,假设您从VC1推送到VC​​2,再推送到VC​​3,再推送到VC​​4。如果你想从VC4一直弹回到VC1,你可以在VC4中连接IBAction,如:

    - (IBAction)popToRoot:(id)sender
    {
        [self.navigationController popToRootViewControllerAnimated:YES];
    }
    

    或者,如果你想从VC4回弹到VC2,你会

    - (IBAction)popToVC2:(id)sender
    {
        for (UIViewController *controller in self.navigationController.viewControllers)
        {
            if ([controller isKindOfClass:[ViewController2 class]])
            {
                [self.navigationController popToViewController:controller animated:YES];
                return;
            }
        }
    }
    

    如果您将VC2的引用传递给VC3然后再传递给VC4,则可以通过navigationController.viewControllers避免此迭代,但有时上述技术更容易。

    顺便说一句,如果你只支持iOS 6及更高版本,并且正在使用故事板,你也可以使用展开segue,这是一种更优雅的方式,可以弹回特定的视图控制器。但目前尚不清楚(a)你是否正在使用故事板; (b)你只支持iOS 6及以上版本,因此我现在不会讨论放松细分。

答案 1 :(得分:0)

第一:
向我们展示一些代码,您可以在其中推送新的视图控制器,也许是您的整个导航控制器代码

第二(解决方案)

我假设:

  • 您的上一个/下一个按钮链接到您的navigationController类
  • 当你点击其中一个按钮时,你有适当的方法(prevPressed:/ nextPressed :),这些方法被调用

我可以为您提供以下帮助:

  • 您知道visibleViewController @property
  • 目前哪个控制器可见
  • 每次点击导航栏中的按钮,您都可以询问visibleViewController应该按下/弹出下一个/上一个视图控制器

如果所有控制器VC1 / 2/3/4都是viewController类的子类,那么最好的解决方案就是在它的接口中定义一个方法:

- (Class)nextViewControllerClass;
- (Class)previousViewControllerClass;

并在实施中:

- (Class)nextViewControllerClass {
    return [VC4 class];
}

- (Class)previousViewControllerClass {
    return [VC1 class];
}

在你的navigationController代码中执行以下操作:

- (IBAction)next:(id)sender {
    UIViewController *nextViewController = [[[self.visibleViewController nextViewControllerClass] alloc] init];
    [self pushViewController:nextViewController animated:YES];
}