self.navigationController 分配为 RootViewController 后为空?

Posted

技术标签:

【中文标题】self.navigationController 分配为 RootViewController 后为空?【英文标题】:self.navigationController is null after it is assign as RootViewController? 【发布时间】:2011-08-11 04:23:29 【问题描述】:

我创建了一个新的 xcode 项目作为基于视图的应用程序,并且我有一组 UIViewController(s),我计划在单独的 UINavigationController(s) 中使用它们。

在所有UINavigationController(s) 之前的ParentViewController.m 和所有myViewControllers 被启动之后:

NSMutableArray *navControllers = [[NSMutableArray array];
for (id aVC in self.myViewControllers) 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:aVC];

    //[aVC setNavigationController:navController];
    [navController setNavigationBarHidden:YES];
    [navController setToolbarHidden:YES];
    [navControllers addObject:navController];
    [navController release];


_navigationControllers = [[NSArray arrayWithArray:navigationControllers] retain];

_navigationControllers 保留为 ParentViewController 的成员,所以我想我在 for 循环中启动的所有导航控制器都由 _navigationControllers 保留,因此它们不会被释放或变为 nil,但是当我尝试使用MyViewController中的navigationController推SomeOtherViewController,不行:

- (IBAction)pushDetailView 
     [self.navigationController pushViewController:self.detailViewController animated:YES];

我在pushViewController:someOtherViewController 之前放了一个断点,然后“po [self navigationController]”,控制台告诉我这是一个nil 引用。

我假设当我这样做时 [[UINavigationController alloc] initWithRootViewController:aVC],底层机制会将navigationController 分配为aVC.navigationController,因为Apple“ios 的视图控制器编程指南”也没有将navigationController 分配给rootController

除非我取消标记 for 循环 //[aVC setNavigationController:navController]; 的第二行,否则 navigationController 在 aVC 中不存在。

我误解了机制吗?我的情况还有其他解决方案吗? 提前致谢!

【问题讨论】:

你能从 parent.h 文件中显示 _navigationControllers 的属性声明吗?您在问题中的所有假设/逻辑对我来说似乎都可以(即 initWithRootViewController 应该自动在根视图控制器上设置 navigationController 属性) 【参考方案1】:
_navigationControllers = [NSMutableArray array];
for (id aVC in self.myViewControllers) 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:aVC];

    //[aVC setNavigationController:navController];
    [navController setNavigationBarHidden:YES];
    [navController setToolbarHidden:YES];
    [navControllers addObject:navController];


// assuming index 0 navigation controller is with 'ParentViewController'
self.rootViewController = [_navigationControllers objectAtIndex:0];

检查一下。

【讨论】:

以上是关于self.navigationController 分配为 RootViewController 后为空?的主要内容,如果未能解决你的问题,请参考以下文章

self.navigationController.tabBarController.selectedIndex 不起作用

self.navigationController 在 swift 中为零

self.navigationController 分配为 RootViewController 后为空?

iOS 开发:为啥 self.navigationController.navigationBar.frame.size.height 返回零?

Objective-C:使用 self.navigationController 和自定义 UINavigationController

使用 self.navigationController.hidesBarsOnSwipe = true 隐藏导航栏,将其永久隐藏