我在UIViewController Containment上观看了WWDC视频并阅读了这篇博文:http://www.cocoanetics.com/2012/04/containing-viewcontrollers/
但是我无法显示我的初始视图控制器。有什么我想念的吗?在我的ContainerViewController.m
中- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
_homeViewController = [[HomeViewController alloc] init];
_detailViewController = [[DetailViewController alloc] init];
[self setSubViewControllers:@[_homeViewController, _detailViewController]];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if (_selectedViewController.parentViewController == self) {
// nothing to do
return;
}
// adjust the frame to fit the container view
_selectedViewController.view.frame = _containerView.bounds;
// make sure that it resizes on rotation automatically
_selectedViewController.view.autoresizingMask = _containerView.autoresizingMask;
// add as child VC
[self addChildViewController:_selectedViewController];
// add it to container view, calls willMoveToParentViewController for us
[_containerView addSubview:_selectedViewController.view];
// notify that move is done
[_selectedViewController didMoveToParentViewController:self];
}
- (void)loadView {
// set up the base view
CGRect frame = [[UIScreen mainScreen] bounds];
UIView *aView = [[UIView alloc] initWithFrame:frame];
aView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
aView.backgroundColor = [UIColor blueColor];
// set up content view
_containerView = [[UIView alloc] initWithFrame:frame];
_containerView.backgroundColor = [UIColor grayColor];
_containerView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[aView addSubview:_containerView];
self.view = aView;
}
- (void)setSubViewControllers:(NSArray *)subViewControllers {
_subViewControllers = [subViewControllers copy];
if (_selectedViewController) {
// remove previous VC
}
_selectedViewController = _subViewControllers[0];
}
我的ContainerViewController是我的故事板中的初始视图控制器。我看到它在模拟器上显示,但HomeViewController(我的容器中的第一个子视图控制器)没有显示。
当我单步执行调试器时,我的ContainerViewController的subViewControllers属性确实包含homeViewController和detailViewController。 HomeViewController的viewDidLoad也会被调用。除了ContainerViewController的背景颜色外,我在屏幕上看不到任何内容。
有什么想法?感谢。
答案 0 :(得分:0)
您有一个NSArray,但您尝试将其作为C数组访问。
_subViewControllers[0]
应该是:
[_subViewControllers objectAtIndex:0];
话虽这么说,你似乎有一些代码可以在其他方法中更好。我个人会清理它并使其更简单。我会删除loadView和_containerView,只需像通常那样使用self.view。对于您要做的事情,似乎甚至不需要跟踪父视图控制器和子视图控制器。无论如何,我就是这样做的:
@interface ContainerViewController ()
@property (nonatomic, retain) NSArray *subViewControllers;
@end
@implementation ObservationReportViewController {
UIViewController *_selectedViewController;
}
@synthesize subViewControllers = _subViewControllers;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
HomeViewController *homeViewController = [[HomeViewController alloc] init];
homeViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
DetailViewController *detailViewController = [[DetailViewController alloc] init];
detailViewController.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
// Retain the view controllers.
self.subViewControllers = @[homeViewController, detailViewController];
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self setSelectedViewController: [_subViewControllers objectAtIndex:0]];
}
-(void)setSelectedViewController:(UIViewController *)selectedViewController {
if (_selectedViewController != selectedViewController) {
[_selectedViewController.view removeFromSuperview];
_selectedViewController = selectedViewController;
// adjust the frame to fit the container view
[self.view addSubview:_selectedViewController.view];
//_selectedViewController.view.frame = _containerView.bounds;
_selectedViewController.view.frame = self.view.bounds;
}
}
答案 1 :(得分:0)
所以我不是世界上最聪明的人,但屏幕上没有显示任何内容的原因是因为笔尖在故事板中,我需要这样做:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
_homeViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
_detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
希望这可以帮助那些也不熟悉Storyboard的人。
答案 2 :(得分:0)