Container View Controller中的初始视图控制器未显示

时间:2012-12-05 03:29:30

标签: ios uiviewcontroller

我在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的背景颜色外,我在屏幕上看不到任何内容。

有什么想法?感谢。

3 个答案:

答案 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)

如果通过故事板将StoryViewController设置为与MainStoryboard不同的故事板,则需要更新项目设置以使用该新故事板。

enter image description here

转到项目设置,常规并将主界面设置设置为新的故事板

enter image description here