UINavigationController和UIViewController的导航控制器属性

5

我最近偶然发现了这个问题,我想知道为什么会设计成这样。

如果你有一个包含容器视图的UINavigationController且其中嵌入了一个视图控制器的子控制器,那么为什么这个子控制器的self.navigationController属性值不会被设置呢?

根据苹果文档上的描述:

在视图控制器层次结构中离当前视图控制器最近的导航控制器。(只读)

@property(nonatomic, readonly, retain) UINavigationController *navigationController 讨论 如果接收者或其任意祖先是导航控制器的子控制器,则此属性包含拥有该导航控制器。如果视图控制器未嵌入到导航控制器中,则此属性为空。

对于我来说,因为它的父级嵌入到导航控制器中,所以我认为它应该把它的引用向下传递给它的子控制器。我错过了什么吗?这种情况不是有很好的理由吗?


你是如何添加子视图控制器的?也许在这里出了什么问题。 - Ethan Mick
在IB中:NavController-rootview->ViewControllerA的容器视图-嵌入式segue->ViewControllerB - Erik
1个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
1

你好,我有和你一样的问题。我通过以下代码解决了它,以显示视图控制器:

        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

        AboutTheAppViewController *loginVC = [storyboard instantiateViewControllerWithIdentifier:@"aboutMenuSegueID"];
        [self addChildViewController:loginVC];
        [loginVC didMoveToParentViewController:self];

        [self.view addSubview:loginVC.view];

然后我将这个代码添加到AboutTheAppViewController(我的控制器将显示此代码)中:

 -(void)willMoveToParentViewController:(UIViewController *)parent

{
     NSLog(@"FirstViewController moving to or from parent view controller");
 //    self.view.backgroundColor=[UIColor blueColor];
}

-(void)didMoveToParentViewController:(UIViewController *)parent
{
   NSLog(@"FirstViewController did move to parent view controller");
//    self.view.frame = CGRectMake(20, 20, 280, 528);
}

我希望它有所帮助。


有趣的是,考虑到在 IB 中它不起作用,这个方法确实有效。我一直在寻找 IB 的解决方案,而且我还想知道这是否是故意安排的,而不仅仅是疏忽。如果没有其他人对这个问题有任何看法,我将接受这个答案。 - Erik
@Erik,我很高兴能帮到你。我不确定是否可能,但我会看看并找出答案。好的,尽管我很想让这个答案被接受,但我希望你能找到更好的答案 :) - Septronic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,