从代码实例化View Controller - viewDidLoad何时调用iOS

时间:2013-04-10 08:56:13

标签: ios uiviewcontroller

我使用的是:
VC = [[SettingsViewController alloc] initWithNibName:nil bundle:nil];

尚未调用viewDidLoad 但是当我这样做时:
VC.view.frame = CGRectMake(...);

此时调用viewDidLoad。

但问题是,我在viewDidLoad方法中没有使用我在上面的代码语句中传递的视图尺寸。
我认为它看到正在使用视图,所以是时候加载视图了,加载视图后必须将帧尺寸分配给视图。但是,如果我希望调用viewDidLoad之前设置的视图尺寸,那么我可以在viewDidLoad方法中使用这些尺寸。
initWithFrame..

这样的东西

另外,我在视图控制器中没有视图尺寸。我必须从VC外部分配视图尺寸 所以可能在调用initWithNibName:bundle:方法之后我可以将视图框架尺寸保存在某个变量中..但这看起来不是一个干净的解决方案,是吗?

2 个答案:

答案 0 :(得分:3)

视图加载时调用

viewDidLoad。 (惊奇)

所以当你在回复之前调用VC.view时,将执行viewDidLoaded,然后返回视图,并设置框架。

所以根据你目前的方法,这是不可能的

无论如何,为什么你需要viewDidLoad中的视图框?也许你可以将那部分移动到viewWillAppear / viewDidAppear,只有在视图即将出现时才会被调用

答案 1 :(得分:2)

您可以这样做:

在界面中

@interface SettingsViewController : ... {
    CGRect _initialFrame;
}

...

- (id)initWithFrame:(CGRect)frame;

@end

在实施中

- (id)initWithFrame:(CGRect)frame 
{
    self = [super initWithNibName:nil bundle:nil];
    if (self) {
        _initialFrame = frame;
    }

    return self;
}

- (void)viewDidLoad
{
    self.view.frame = _initialFrame;

    [super viewDidLoad];
}

然后从你使用这些控制器的类开始:

VC = [[SettingsViewController alloc] initWithFrame:CGRectMake(...)];