在iOS中使用带有.xib文件的多个视图控制器时,尝试使用UNavigationController的子类



我正在构建一个iOS应用程序,其中有多个由.xib文件组成的视图控制器。整个应用程序将允许纵向和横向,但前三个视图控制器将仅限于纵向。之后的屏幕将只显示横向。出于这个原因,我创建了UINavigationController的两个子类,一个子类用于在纵向模式下限制前三个子类,最后一个子类则用于横向模式。

目前,我可以显示第一个视图控制器,并将其锁定在人像模式。这是我的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    ViewControllerA *testViewA = [[ViewControllerA alloc] initWithNibName:@"ViewControllerA" bundle:nil];
    PortraitNavigationController *navController = [[PortraitNavigationController alloc] initWithRootViewController:testViewA];
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = navController;
    [self.window makeKeyAndVisible];
    return YES;
}

PortraitNavigationController(它是UINavigationController的子类)的代码包含一个方法,如下所示:

-(NSUInteger)supportedInterfaceOrientations{
    return UIInterfaceOrientationMaskPortrait;
}

在ViewControllerA内部,我有一个按钮,当按下时,它会调用ViewControllerB(它也将被锁定在纵向模式中。我在按钮操作方法中的代码如下:

- (IBAction)buttonAction:(id)sender {
   PortraitBViewController *testBView = [[PortraitBViewController alloc] initWithNibName:@"PortraitBViewController" bundle:nil];
        PortraitNavigationController *portraitNav = [[PortraitNavigationController alloc] initWithRootViewController:testBView];
//How do I push this new view Controller on to the stack?
}

正如你在我上面的评论中看到的,我如何将下一个视图控制器推到这个堆栈上(当然,然后弹出返回到上一个)?我遇到的问题是,像传统的应用程序一样,我希望有一堆视图控制器,但在我的情况下,我想使用自定义的UINavigationController类。

通常,我会使用引用self.navigationController将下一个视图控制器推送到堆栈中,但在这种情况下,因为我使用的是自定义导航控制器,所以看起来我必须在我使用的每个视图控制器中创建一个对自定义导航控制器的新引用。如果是这种情况,那么这意味着我每次都要创建一个新的rootViewController,这意味着本质上,我将有三个不同的堆栈(每个堆栈一个视图控制器),而不是一个由三个视图控制器组成的堆栈。

如何使用对自定义UINavigationController的相同引用来调用推送/弹出每个视图控制器?最后,我该如何将这些视图控制器连接到另一个使用不同导航控制器的视图控制器,同时将所有内容保持在同一堆栈上?

如果使用多个UINavigationControllers,您的生活将非常困难。您应该指定UIViewControllers中支持哪些方向,而不是UINavigationControllers。

最新更新