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

Posted

技术标签:

【中文标题】UINavigationController 不会在推送的 UIViewController 上调用 viewDidLoad【英文标题】:UINavigationController does not call viewDidLoad on pushed UIViewController 【发布时间】:2014-06-02 09:30:24 【问题描述】:

我在将 UIViewController 推入 UINavigationController 时遇到了一个奇怪的问题。 CustomTableViewControllerUITableViewController 的子类

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

由于某种原因,导航控制器已加载并在屏幕上可见,但 viewDidLoad从未CustomTableViewController 上调用。

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

[navVC pushViewController:vc animated:YES];

但是,以下方法DOvc 上调用viewDidLoad

    [self.view addSubview:vc.view]; [self presentViewController:navVC animated:YES completion:nil]; [self presentViewController:vc animated:YES completion:nil];

所以我倾向于认为 View Controller 和 Navigation Controller 都没有问题。但是,我不知道为什么视图没有被加载。手动强制 [vc view] 将加载视图,但不会调用其他视图生命周期方法。

CustomTableViewController 也没有什么问题,因为使用UITableViewController 本身也不起作用。

有什么想法吗?

【问题讨论】:

为什么要添加 navVC 视图作为 self.view 的子视图?我认为您没有正确使用它。但是,是的,如果您正在做的事情是正确的(我认为不是),那么下面的@Bobj-C 答案将起作用。 我有一个带有一些动态添加的 ViewController 的 UITabBarController。每个 ViewController 都拥有一个(将来会是多个)动态表单,它可以是 UITableViewController(具有自己的逻辑)。这个 UITableViewController 使用 UINavigationController 来实现它背后的添加/编辑逻辑。 听起来您可能应该将您的 navVC 放入您的 UITabBarController 上的 viewControllers 数组中 如果你想拥有来自标签栏控制器的导航控制器,那么你应该将它作为... UITabBarController - UINavigationController - ContentControllers。 Tab Bar 然后在 NavigationControllers 之间切换。 不是真的,因为以后可能我的VC的上半部分是带Navigation Controller的TableView,而下半部分是另外一种表单类型。 【参考方案1】:

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

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

希望这可行

【讨论】:

这里其实不需要调用willMoveToParentViewController:,因为addChildViewController:会在添加子视图控制器之前自动调用。【参考方案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];

【讨论】:

以上是关于UINavigationController 不会在推送的 UIViewController 上调用 viewDidLoad的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 不会推送其他视图控制器?

UINavigationController 不会 pushViewController

UIBarButton 不会显示在我的 UINavigationController

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

UINavigationController 导航栏在横向模式下不会缩小

UITabBarController 中的 UINavigationController 在 iOS 6 中不会旋转