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

时间:2012-04-25 11:57:45

标签: ios uiviewcontroller storyboard

我试着在单个视图中显示多个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

然后在界面构建器的故事板中

  • 添加3个视图控制器
  • 为每一个分配了一个类ParentViewController,Child1Controller&amp; Child2Controller
  • 在Child2Controller对象中,在View中添加了一个UILabel。
  • Child2Controller.h中的
  • 为UILabel定义了IBOutlet,并在Child2Controller.m中为其添加了一个合成语句
  • 最后在project-Info.plist中设置主故事板文件

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

从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

希望它有所帮助。