在UIViewController中添加UINavigationController

9
我是一位有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

我有一个带有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];
}

3
你需要在导航控制器中添加视图控制器。[[MyNavigationController alloc] initWithRootViewController:viewController]; - HelmiB
2个回答

17

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

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

请参阅视图控制器编程指南以获取更多详细信息。


2
我正在做同样的事情,但导航控制器的高度和宽度不符合我设置的框架。虽然原点是正确的。你能帮忙吗? - Sam
通常这与自动布局有关,而不是视图控制器嵌套。您可能需要在代码中添加约束,并确保 translatesAutoresizingMaskIntoConstraints 设置为 NO。如果您正在使用弹簧和支架,请确保在将视图添加到父视图之前添加它们。 - architectpianist
1
最初我是通过编程创建了一个 UINavigationController 并将其添加进去。后来我通过在 IB 中创建了一个 Container 视图,并将其与我的 UINavigationController 进行连接,解决了这个问题。完全没有添加任何代码,一切都通过 IB 完成,现在它已经可以正常工作了。 - Sam
1
我遇到了与@Sam相同的问题,关于框架高度/宽度。在IB中,我创建了一个虚拟的UIView,其大小与我想要的一样,然后使用mynav.view.frame = parentvc.ncplace.frame进行复制。Xcode显示框架符合预期,但实际上它却不正确。回读取的值看起来是正确的,但如果我在viewDidAppear中再次读取它,则会发生更改。也许因为我被锁定在横屏模式下。我可以通过在方法中设置框架来使其工作,但是那样外观动画就不太好看了。相反,我在viewDidLayoutSubviews中执行这些步骤并重新布局,小心不要递归。对我来说这很有效。 - Brian White
4
小细节:您不发送[myNav willMoveToParentViewController:self]消息。-[UIViewController addChildViewController:]将发送此消息。相反,当删除子视图控制器时,您需要发送[navController willMoveToParentViewController:nil]。然后-removeFromParentViewController将发送[navController didMoveToParentViewController:nil]。 - emp

1

对于 Swift 5

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

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