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

Ios Interface Builder IB-导航控制器,跳过视图,ios,uinavigationcontroller,interface-builder,Ios,Uinavigationcontroller,Interface Builder,您好,我是iOS新手,有一个关于浏览我的视图的问题 我正在使用IB连接导航栏中的“上一个”和“下一个”按钮,以推送我的视图。这一切都很好。然而,我很难找到我到底需要做什么,或者我需要把代码放在哪里,这样我就可以跳过一个视图。为了简化我的处境 -我有1个导航控制器和4个视图控制器,分别命名为VC1、VC2、VC3、VC4。每个VC都有一个.H/.M -从VC1开始,它们一个接一个地跟随 假设我想跳过VC3,然后根据VC2中的设置直接跳到VC4。我应该把代码放在哪里做这件事?我需要从VC3的导航按钮

您好,我是iOS新手,有一个关于浏览我的视图的问题

我正在使用IB连接导航栏中的“上一个”和“下一个”按钮,以推送我的视图。这一切都很好。然而,我很难找到我到底需要做什么,或者我需要把代码放在哪里,这样我就可以跳过一个视图。为了简化我的处境

-我有1个导航控制器和4个视图控制器,分别命名为VC1、VC2、VC3、VC4。每个VC都有一个.H/.M -从VC1开始,它们一个接一个地跟随

假设我想跳过VC3,然后根据VC2中的设置直接跳到VC4。我应该把代码放在哪里做这件事?我需要从VC3的导航按钮上取下IBAction方法吗

我很抱歉,如果这已经涵盖了以前。如果有一个图坦卡蒙或者如果你知道有一个帖子回答这个问题,请让我知道。我做了一次搜索,但搜索返回的是一般性帖子,可能是因为我使用了错误的术语

提前谢谢。

首先:
向我们展示一些代码,您在哪里推出新的视图控制器,可能是您的整个导航控制器代码

第二个(解决方案)

我假设:

  • 上一个/下一个按钮链接到navigationController类
  • 您有相应的方法(prevPressed:/nextPressed:),单击其中一个按钮时会调用这些方法
我可以在以下方面帮助您:

  • 使用
    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];
}
有几点想法:

  • 如果您想从VC2推送到VC3或VC4,而不是在特殊情况下让VC3立即推送到VC4,我认为最好让VC2直接推送到适当的视图控制器。因此,您可能在VC2中有一个
    iAction
    ,它可以为您执行以下操作:

    - (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推到VC4,当您弹回时,您将自动弹回VC2)

    显然,如果您使用的是故事板,而不是手动调用
    pushViewController
    ,那么您可以从VC2中获得两个分段(一个到VC3,一个到VC4),为它们提供适当的标识符,然后只需调用
    performsguewithidentifier
    即可切换到适当的视图控制器。但思想是一样的:您可以定义一个
    iAction
    ,根据您选择的逻辑执行适当的切换

  • 你说“导航栏上有“上一个”和“下一个”按钮,可以按我的视图”,我想知道你的“上一个”按钮。这是在执行
    popViewControllerAnimated
    ?通常,“下一个”按钮会按到新的视图控制器,但“上一个”按钮按钮不应按到上一个视图,而应弹回到上一个视图。如果不弹回来,您可能会得到一些上一个视图控制器的多个实例。因此,“上一个”按钮应链接到执行以下操作的
    IBOutlet

    - (IBAction)popToPrevious:(id)sender
    {
        [self.navigationController popViewControllerAnimated:YES];
    }
    
  • 当弹出回显时,您显然会弹出回您从中推送的视图控制器。如果您想在弹出回6.0之前的iOS版本时跳过一些视图控制器,您可以使用
    popToViewController
    popToRootViewControllerAnimated
    。例如,假设您从VC1推送到了VC2,到VC3,到VC4。如果您想从VC4一直弹回到VC1,您可以连接并在VC4中执行
    iAction
    ,如:

    - (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及以上版本,并且正在使用故事板,那么您也可以使用“展开”分段,这是一种更优雅的方式,可以跳回特定的视图控制器。但不清楚(a)您是否在使用故事板;以及(b)您只支持iOS 6及更高版本,因此我将在这一点上避免讨论展开分段


  • 您可以添加一些您编写的示例代码吗?您谈到了一些设置,因此设置意味着可能有一些变量。若要跳过某个视图,您可以检查该变量并跳过压入导航控制器的VC3。如果您共享您的代码,其他人将更容易回答您的问题。感谢您抽出时间回答。I非常感谢。我不知道如何从故事板中提取源代码,因为我只是在“下一步”中按CTRL键拖动将当前视图上的按钮切换到下一个场景的视图控制器。我本应该更详细地说明变量,它实际上只是一个开/关开关,因此根据开关,我会转到VC3或VC4。再次感谢您的帮助。我建议在按住ctrl键拖动以创建“下一个”的同时segue通常是最优雅的方法,当执行需要编程控制的操作(例如,有选择地选择要转到哪个视图)时,您可以使用
    iAction
    (ctrl拖动到助手编辑器中的.h文件并执行“操作”)。而且您肯定不想使用来自“previous”按钮切换到上一个场景。这是一场灾难。Rob,为什么使用拖放方法倒退会不好?[这不是m的方式]