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。这是一种新的方法,允许您创建自定义控制器容器,如UINavigationController
或UITabBarController
。
就你而言,这可能非常有用。事实上,在故事板中,您可以创建父控制器和两个子控制器。父母可以链接到另一个场景,而两个孩子没有链接。它们是独立的场景,您可以在您的父控制器中使用它们。
例如,在父控制器的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。
希望它有帮助。
+1这确实工作得很好。但是我想知道的是我在问题中发布的代码/流程中所做的错误。 – vikmalhotra 2012-04-26 02:21:57
@ShiVik那么Child2Controller呢?它是用xib加载还是覆盖* loadView *方法? – 2012-04-26 07:46:44
不,我没有创建一个新的xib文件,也没有'loadView'。我所做的是我在故事板中添加了一个UIViewController,并在身份检查器中将其自定义类分配为“Child2Controller”。 – vikmalhotra 2012-04-26 08:12:16