【问题标题】:Initial view controller in Container View Controller not being shown容器视图控制器中的初始视图控制器未显示
【发布时间】:2012-12-05 03:29:30
【问题描述】:

我在 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 的背景颜色。

有什么想法吗?谢谢。

【问题讨论】:

    标签: ios uiviewcontroller


    【解决方案1】:

    所以我不是世界上最聪明的人,但屏幕上什么都没有显示的原因是因为笔尖在情节提要中,而我需要这样做:

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
        _homeViewController = [storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
        _detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
    

    希望这对还不熟悉 Storyboard 的人有所帮助。

    【讨论】:

    • 我不知道你这样做是不是出于教育目的,但通过在故事板中使用容器视图,几乎无需代码即可完成。
    • @Crystal 在此处发帖时,说明您是否使用故事板以及是否使用 ARC 总是很有帮助的。
    【解决方案2】:

    您有一个 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;
        }
    }
    

    【讨论】:

    • [0] 在 iOS 6 中不是问题。我尝试了您的建议,但仍然没有显示 HomeViewController。不知道为什么仍然...
    • @Crystal 最后一行有错字。刚刚修好了。您可能想确保调用我提供的 init 方法,而不仅仅是 init()
    【解决方案3】:

    如果您通过故事板在与 MainStoryboard 不同的故事板中设置 InitialViewController,则需要更新项目设置以使用该新故事板。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      相关资源
      最近更新 更多