UINavigationController不会在推送的UIViewController上调用viewDidLoad

时间:2014-06-02 09:30:24

标签: ios objective-c uiviewcontroller

我面临着将UIViewController推入UINavigationController的奇怪问题。 CustomTableViewControllerUITableViewController

的子类
CustomTableViewController* vc = [[CustomTableViewController alloc] initWithStyle:UITableViewStylePlain];
UINavigationController *navVC = [[UINavigationController alloc] initWithRootViewController:vc];
[self.view addSubview:navVC.view];

出于某种原因,导航控制器已加载并在屏幕上显示,但在viewDidLoadCustomTableViewController 从未调用。

之后手动推送VC也不起作用(仍未加载vc的视图)

  • [navVC pushViewController:vc animated:YES];

但是,以下方法 DO viewDidLoad上致电vc

  1. [self.view addSubview:vc.view];
  2. [self presentViewController:navVC animated:YES completion:nil];
  3. [self presentViewController:vc animated:YES completion:nil];
  4. 所以我倾向于认为View Controller和导航控制器没有任何问题。但是,我不知道为什么没有加载视图。手动强制[vc view]将加载视图,但不会调用其他视图生命周期方法。

    CustomTableViewController也没有错,因为使用UITableViewController本身也不起作用。

    有什么想法吗?

2 个答案:

答案 0 :(得分:2)

您需要将其添加为子视图控制器

    [childController willMoveToParentViewController:rootViewController];
    [rootViewController addChildViewController:childController];
    [rootViewController.view addSubview:childController.view];
    [childController didMoveToParentViewController:rootViewController];

希望这有效

答案 1 :(得分:2)

我怀疑您遇到问题,因为您似乎正在尝试制作自定义容器视图控制器。

Read up on Apple's guide on custom container view controllers.

在本指南中,以下是一些添加和删除子视图控制器的示例方法:

Swift 3.0:

func display(contentController content: UIViewController) {
    addChildViewController(content)

    // Here, frameForContentController is just some function you define
    // that calculates and returns the frame of the content controller's view.
    content.view.frame = frameForContentController()

    view.addSubview(content.view)
    content.didMove(toParentViewController: self)
}

func hide(contentController content: UIViewController) {
    content.willMove(toParentViewController: nil)
    content.view.removeFromSuperview()
    content.removeFromParentViewController()
}

<强>目标-C:

- (void)displayContentController:(UIViewController *)content
{
   [self addChildViewController:content];

   // Here, [self frameForContentController] is just some method you define
   // that calculates and returns the frame of the content controller's view.
   content.view.frame = [self frameForContentController];

   [self.view addSubview:content.view];
   [content didMoveToParentViewController:self];
}

- (void)hideContentController:(UIViewController *)content
{
   [content willMoveToParentViewController:nil];
   [content.view removeFromSuperview];
   [content removeFromParentViewController];
}