在initWithFrame之前调用viewDidLoad?

adi*_*dit 2 iphone objective-c ipad ios

我有一个自定义init方法:

- (id) initWithFrame:(CGRect ) frame andImage:(UIImage *) image
{
    self = [super init];
    if (self){
        self.view.frame = frame;
        self.imageView_.image = image;
        self.imageScrollView_.frame = self.view.frame;
        imageOriginalFrame = frame;
        zoomedImageFrame = frame;
         NSLog(@"SCREEN DIM %f AND %f", zoomedImageFrame.size.height, zoomedImageFrame.origin.y);
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

这是我如何呈现它:

FullSizeImageViewController * fullSize = [[FullSizeImageViewController alloc] initWithFrame:imageOriginalFrame andImage:image];
                    if ([self.delegate respondsToSelector:@selector(fullStoryViewController:presentModalViewController:animated:)]) {
                        [self.delegate fullStoryViewController:self presentModalViewController:fullSize animated:YES];
                    }
Run Code Online (Sandbox Code Playgroud)

但是,令人惊讶的是我的viewDidLoad在initWithFrame之前被调用.这怎么可能?

我猜这是因为我打电话给超级初始化?如果不是我该怎么做?

rob*_*off 8

你的viewDidLoad方法是没有得到所谓的之前initWithFrame:andImage:的方法.您的viewDidLoad方法您的initWithFrame:andImage:方法中被调用.

您的initWithFrame:andImage:方法包含以下行:

self.view.frame = frame;
Run Code Online (Sandbox Code Playgroud)

这是简写​​:

[[self view] setFrame:frame];
Run Code Online (Sandbox Code Playgroud)

所以你的方法是调用-[UIViewController view]方法.该-[UIViewController view]方法基本上是这样的:

- (UIView *)view {
    if (!_view) {
        [self loadView];
        [self viewDidLoad];
    }
    return _view;
}
Run Code Online (Sandbox Code Playgroud)

尝试在viewDidLoad方法中添加断点.当它被击中时,查看堆栈跟踪.你会发现initWithFrame:andImage:它.

  • 为了继续这一点,你不应该在init方法中做这种工作.所有这些都应该在`viewDidLoad`中.您的`imageView`通常不会存在于您的init方法中,除非您通过引用`view`强制加载nib文件. (3认同)