UINavigationController 和 UIViewController 的导航控制器属性

Posted

技术标签:

【中文标题】UINavigationController 和 UIViewController 的导航控制器属性【英文标题】:UINavigationController and the UIViewController's navigation controller property 【发布时间】:2014-08-22 16:42:12 【问题描述】:

我最近遇到了这个问题,我想知道为什么要这样设计。

如果您有一个UINavigationController,他的孩子有一个容器视图,其中有一个嵌入式视图控制器,为什么这个孩子的self.navigationController 属性没有被设置?

来自 Apple Doc 的主题:

视图控制器层次结构中最近的祖先是导航控制器。 (只读)

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

对我来说,我认为因为它的父级嵌入到导航控制器中,所以它会将它的引用沿链传递给它的子级。我错过了什么吗?是否有充分的理由不是这种情况?

【问题讨论】:

如何添加子视图控制器?也许那里出了点问题。 在IB中:NavController-rootview->ViewControllerA的容器view-embed segue->ViewControllerB 【参考方案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 我很高兴它有所帮助。我不确定这是否可能,但我会看看,看看我能找到什么。好的,尽管我希望答案被接受,但希望您能找到更好的答案:)

以上是关于UINavigationController 和 UIViewController 的导航控制器属性的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 标题和按钮

(Swift) 在嵌套在 Main UINavigationController 中的 UINavigationController 和 UITabController 之间切换

UINavigationController 和 titleView

UINavigationController 子类和推送 Segue

关闭 UINavigationController 并呈现另一个 UINavigationController

继承 UITabBarController 和 UINavigationController