2012-12-05 24 views
0

我看了UIViewController的遏制了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

你有一個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

的[0]是不是在iOS的6個問題我想你建議,但它仍然不顯示HomeViewController。不知道爲什麼仍然... – Crystal

+0

@Crystal我在最後一行有一個錯字。只是修復它。你可能想要確保我提供的init方法被調用,而不僅僅是'init()'。 –

0

所以我不是最聰明的人在世界上,但原因沒有正被顯示在屏幕上是因爲碎粒是在故事板,我需要要做到這一點,而不是:

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

希望這可以幫助那些也不熟悉故事板的人呢。

+0

我不知道你是否這樣做是爲了教育目的,但是這可以通過在故事板中使用容器視圖幾乎沒有代碼來完成。 – rdelmar

+0

@Crystal在這裏發佈時,如果您正在使用故事板並且還使用ARC,則始終有幫助。 –

0

如果您在故事板中設置InitialViewController與MainStoryboard不同,那麼您需要更新項目設置以使用新的故事板。

enter image description here

轉到項目設置,常規和設置主界面設置新的情節串連圖板

enter image description here

相關問題