UIViewController包含

时间:2012-09-05 17:14:37

标签: ios cocoa-touch ios5 uiviewcontroller

我正在尝试在我的一个项目中使用UIViewController包含功能。该应用程序仅用于横向模式。

我将UIViewController A 添加为UIViewController B 的子项,并添加 A 的主视图作为其中一个的子视图B 的观点。我也在B中保存对A的引用:

@interface BViewController : UIViewController

@property (retain, nonatomic) AViewController *aVC;

@end

@implementation BViewController : UIViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.aVC = [self.storyBoard instantiateViewControllerWithIdentifier:@"A"];
    [self addChildViewController:self.aVC];
    [self.myContainerView addSubview:self.aVC.view];
}

@end

我遇到的问题是横向不被尊重。我做了一些调试并找到了一个解决方案,但我担心这并不理想,因为它更像是一个黑客攻击:

在B:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.aVC = [self.storyBoard instantiateViewControllerWithIdentifier:@"A"];
    [self addChildViewController:self.aVC];
    [self.myContainerView addSubview:self.aVC.view];
    [self.aVC didMoveToParentViewController:self];
}

在A:

- (void)didMoveToParentViewController:(UIViewController *)parentVC
{
    // Interchange width and height
    self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.**height**, self.view.frame.size.**width**);
}

我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:6)

您的代码:

self.aVC = [self.storyBoard instantiateViewControllerWithIdentifier:@"A"];
[self addChildViewController:self.aVC];
[self.myContainerView addSubview:self.aVC.view];

总是错的。将父项添加到子控制器后,必须将didMoveToParentViewController:发送给子控制器。请参阅我的讨论:

http://www.apeth.com/iOSBook/ch19.html#_container_view_controllers

至于轮换,很可能你太早做了这一切。该应用程序以纵向方式开始,并且在调用viewDidLoad时尚未旋转到横向。我在这里给出了解决这个问题的方法:

http://www.apeth.com/iOSBook/ch19.html#_rotation

请注意那里的建议,等到didRotateFromInterfaceOrientation:完成设置视图的外观。我想你可能会面临我在那里描述的相同问题。