iOS:UIViewController不显示使用故事板的另一个UIViewController

问题描述:

我试着在单个视图内显示多个UIViewController对象。目前我想在应用程序加载时显示单个UIViewController对象。但是应用程序屏幕显示为空白,而应该在子视图控制器内显示一个标签。iOS:UIViewController不显示使用故事板的另一个UIViewController

这里是我做过什么:

ParentViewController.h

#import <UIKit/UIKit.h> 
@interface ParentViewController : UIViewController 
{ 
    UIViewController *child1Controller; 
    UIViewController *child2Controller; 
} 
@end 

ParentViewController.m

#import "ParentViewController.h" 
#import "Child1Controller.h" 
#import "Child2Controller.h" 

@interface ParentViewController() 
@end 

@implementation ParentViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { ... } 

- (void)viewDidLoad 
{ 
    child2Controller = [[Child2Controller alloc] init]; 
    [self.view addSubview:child2Controller.view]; 

    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

} 

- (void)viewDidUnload { ... } 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { ... } 

@end 

然后在Interface Builder故事板

  • 添加3视图控制器
  • 为其中的每一个分配了一个类ParentViewController,Child1Controller & Child2Controller
  • 在Child2Controller对象中,在View中添加了一个UILabel。在Child2Controller.h
  • 定义的IBOutlet中进行的UILabel和Child2Controller.m
  • 增加了合成语句相同
  • 最后在项目的Info.plist设置的主要故事板文件

难道我在想念的东西这里?

从iOS 5开始,可以利用View Controller Containment。这是一种新的方法,允许您创建自定义控制器容器,如UINavigationControllerUITabBarController

就你而言,这可能非常有用。事实上,在故事板中,您可以创建父控制器和两个子控制器。父母可以链接到另一个场景,而两个孩子没有链接。它们是独立的场景,您可以在您的父控制器中使用它们。

例如,在父控制器的viewDidLoad方法,你可以做到以下几点:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UIStoryboard *storyboard = [self storyboard]; 

    FirstChildController *firstChildScene = [storyboard instantiateViewControllerWithIdentifier:@"FirstChildScene"]; 
    [self addChildViewController:firstChildScene]; 
    [firstChildScene didMoveToParentViewController:self]; 
} 

然后在你的FirstChildController覆盖didMoveToParentViewController

- (void)didMoveToParentViewController:(UIViewController *)parent 
{ 
    // Add the view to the parent view and position it if you want 
    [[parent view] addSubview:[self view]]; 
    CGRect newFrame = CGRectMake(0, 0, 350, 400); 
    [[self view] setFrame:newFrame]; 
} 

,瞧!您有一个包含由子控制器管理的一个视图的控制器。请参阅how-does-view-controller-containment-work-in-ios-5

希望它有帮助。

+0

+1这确实工作得很好。但是我想知道的是我在问题中发布的代码/流程中所做的错误。 – vikmalhotra 2012-04-26 02:21:57

+0

@ShiVik那么Child2Controller呢?它是用xib加载还是覆盖* loadView *方法? – 2012-04-26 07:46:44

+0

不,我没有创建一个新的xib文件,也没有'loadView'。我所做的是我在故事板中添加了一个UIViewController,并在身份检查器中将其自定义类分配为“Child2Controller”。 – vikmalhotra 2012-04-26 08:12:16