我面临着将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 在viewDidLoad
上致电vc
:
[self.view addSubview:vc.view];
[self presentViewController:navVC animated:YES completion:nil];
[self presentViewController:vc animated:YES completion:nil];
所以我倾向于认为View Controller和导航控制器没有任何问题。但是,我不知道为什么没有加载视图。手动强制[vc view]将加载视图,但不会调用其他视图生命周期方法。
CustomTableViewController
也没有错,因为使用UITableViewController
本身也不起作用。
有什么想法吗?
答案 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];
}