如何在加载后从视图访问属性

时间:2014-03-18 14:00:15

标签: ios iphone objective-c

故事板:

Storyboard

约束:

enter image description here

结果:

enter image description here

我试图了解自动布局以及如何在容器内使用它。

当我打开Storyboard时,我得到了一个默认的ViewController。我在里面放了一个View Container。然后我添加了一个松散的(没有连接到任何东西)ViewController。我希望将新ViewController中的内容放入容器中。

所以添加到View中的ViewController包含三个标签,我在使用autolayout。

单击Storyboard中容器视图控制器的黑条我转到Identity Inspector并将Custom Class设置为" ContainerViewController"。然后我将故事板ID设置为" ChildController"对于松散的View Controller。

然后我在viewDidLoad中覆盖ContainerViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildController"];
    [self addChildViewController:child];
    [self.view addSubview:child.view];

}

放入容器时,为什么要赢得自动布局工作的约束?我希望他们会,所以我可以进一步采用UIPageViewController。

修改

所以它似乎是帧大小。在将其添加为子视图之前,我需要执行类似的操作:

child.view.frame = CGRectMake(0, 0, 265, 370);

现在我在ViewController.h中为Container创建了一个插座。

@property (weak, nonatomic) IBOutlet UIView *container;

但..从ContainerViewController,如果尚未设置此属性的视图控制器(ViewController),我怎么能问?

ViewController *parent = (ViewController*)self.presentingViewController;
UIView *container = parent.container;

NSLog(@"ParentView Container Width: %f, Height: %f", container.frame.size.width, container.frame.size.height);

它只给了我零宽度和高度,因为视图还没有加载。稍后当它加载时,我得到实际值..

NSLog(@"View Controller Container. Width: %f, Height: %f", self.container.frame.size.width, self.container.frame.size.height);

问题:如何准备/加载presentViewController的属性?

2 个答案:

答案 0 :(得分:1)

添加子视图控制器时,您应该像这样设置其视图框

UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildController"];
[self addChildViewController:child];
[self.view addSubview:child.view];

//set the view frame
child.view.frame = self.view.bounds;

因此,子视图控制器将调整其视图框架的大小,并且布局约束将完成他们的作业;)

修改

将代码放在-(void)viewDidLayoutSubviews中,如下所示:

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    UIViewController *child = [self.storyboard instantiateViewControllerWithIdentifier:@"ChildController"];
    [self addChildViewController:child];
    [self.view addSubview:child.view];

    //set the view frame
    child.view.frame = self.view.bounds;
}

答案 1 :(得分:1)

尝试在viewWillLayoutSubviews中为视图控制器设置框架