UINavigationController 不会在推送的 UIViewController 上调用 viewDidLoad
Posted
技术标签:
【中文标题】UINavigationController 不会在推送的 UIViewController 上调用 viewDidLoad【英文标题】:UINavigationController does not call viewDidLoad on pushed UIViewController 【发布时间】:2014-06-02 09:30:24 【问题描述】:我在将 UIViewController 推入 UINavigationController 时遇到了一个奇怪的问题。
CustomTableViewController
是 UITableViewController
的子类
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];
但是,以下方法DO在vc
上调用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