3

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

我正在使用 IB 连接导航栏中的 PREVIOUS 和 NEXT 按钮来推送我的视图。这一切都很好。但是,我很难找出我需要做的确切位置或需要放置代码的位置,以便我可以跳过视图。为了简化我的情况...

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

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

如果之前已经报道过,我深表歉意。如果有一个 tut 或者如果你知道一个回答这个问题的帖子,请告诉我。我确实进行了搜索,但搜索返回的一般帖子可能是由于我使用了错误的术语。

提前致谢。

4

2 回答 2

1

几个想法:

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

    - (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),给它们适当的标识符,然后调用performSegueWithIdentifier以转入适当的视图控制器。但想法是一样的:您可以IBAction根据您选择的任何逻辑定义一个执行适当转场的方法。

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

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

    - (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;
            }
        }
    }
    

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

    顺便说一句,如果您只支持 iOS 6 及更高版本,并且正在使用情节提要,您还可以使用展开转场,这是一种更优雅的方式返回到特定的视图控制器。但尚不清楚(a)您是否使用故事板;(b) 你只支持 iOS 6 及更高版本,所以我将暂时避免讨论 unwind segues。

于 2013-04-12T16:14:21.797 回答
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];
}
于 2013-04-12T15:38:56.363 回答