【问题标题】:Add UINavigationController inside UIViewController在 UIViewController 中添加 UINavigationController
【发布时间】:2013-07-20 15:56:18
【问题描述】:

我有一个带有 UIToolbar 的 UIViewController(在底部),我想在里面添加一个带有 UINavigationBar 的 UINavigationController。 但是 UINavigationController 没有显示出来。

MyViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];

    int toolBarHeight = 44;
    UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, [self.view bounds].size.height-toolBarHeight, [self.view bounds].size.width, toolBarHeight)];

    UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:nil action:nil];
    toolBar.items = @[button];

    [self.view addSubview:toolBar];

    MyNavigationController *myNav = [[MyNavigationController alloc] init];

    [self addChildViewController:myNav];
}

【问题讨论】:

  • 需要在navigationController里面添加viewController。 [[MyNavigationController alloc] initWithRootViewController:viewController];

标签: iphone ios uiviewcontroller uinavigationcontroller


【解决方案1】:

添加视图控制器作为子视图控制器是不够的。您还需要将导航控制器的视图添加为容器视图控制器的视图的子视图。

[myNav willMoveToParentViewController:self];
myNav.view.frame = navFrame;  //Set a frame or constraints
[self.view addSubview:myNav.view];
[self addChildViewController:myNav];
[myNav didMoveToParentViewController:self];

更多详情请见the View Controller Programming Guide

【讨论】:

  • 我也在做同样的事情,但是导航控制器的高度和宽度与我设置的框架不同。原点是正确的。你能帮忙吗?
  • 通常这与自动布局有关,而不是视图控制器嵌套。您可能需要在代码中添加约束并确保 translatesAutoresizingMaskIntoConstraints 设置为 NO。如果您使用的是弹簧和支柱,请确保在将视图添加到父视图之前添加它们。
  • 最初我以编程方式创建UINavigationController 并添加它。我通过在 IB 的帮助下创建一个容器视图并将其与我的 UINavigationController 连接来解决了这个问题。完全没有添加任何代码,一切都通过 IB 完成,并且运行良好。
  • 我在框架高度/宽度方面遇到了与@Sam 相同的问题。在 IB 中,我创建了一个我想要的大小的虚拟 UIView,然后用 mynav.view.frame = parentvc.ncplace.frame 复制它。 Xcode 说该帧符合预期,但显示错误。读回值看起来是正确的,但如果我在viewDidAppear 中读回它,它已经改变了。也许是因为我被锁在风景中。我可以通过在 that 方法中设置框架来使其工作,但是外观动画并不那么好。相反,我在viewDidLayoutSubviews 中执行这些步骤并重新布局,注意不要递归。这对我有用。
  • 小细节:您不发送 [myNav willMoveToParentViewController:self] 消息。 -[UIViewController addChildViewController:] 将发送消息。相反,当移除一个子视图控制器时,你需要发送[navController willMoveToParentViewController:nil]。然后 -removeFromParentViewController 将发送 [navController didMoveToParentViewController:nil]。
【解决方案2】:

对于 Swift 5

let childNavController = UINavigationController()
parrentVC.addChild(childNavController)
parrentVC.view.addSubview(childNavController.view)
//Add constraints or frame for childNavController here.
childNavController.didMove(toParent: parrentVC)
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多