2012-01-22 45 views
2

我有一個自定義的init方法:viewDidLoad在initWithFrame之前被調用?

- (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; 
} 

,這裏是我如何呈現這些情節:

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

然而,令人驚訝我的viewDidLoad是獲得initWithFrame之前調用。這怎麼可能?

我猜這是因爲我叫超級初始化?如果不是,我該怎麼做?

+0

它實際上通過ib – adit

回答

8

您的viewDidLoad方法沒有被調用之前您的initWithFrame:andImage:方法。您的viewDidLoad方法在您的initWithFrame:andImage:方法中被稱爲

initWithFrame:andImage:方法有這樣一行:

self.view.frame = frame; 

這是該簡寫:

[[self view] setFrame:frame]; 

所以你的方法調用-[UIViewController view]方法。該-[UIViewController view]方法基本上是這樣的:

- (UIView *)view { 
    if (!_view) { 
     [self loadView]; 
     [self viewDidLoad]; 
    } 
    return _view; 
} 

嘗試把一個斷點在viewDidLoad方法。當它被擊中時,看看堆棧跟蹤。你會發現其中有initWithFrame:andImage:

+3

加載爲了繼續這一點,你不應該在你的init方法中做這種工作。所有這些應該在'viewDidLoad'中。你的'imageView'通常不會存在於你的init方法中,除了你通過引用'view'強制加載一個nib文件。 –

+0

那麼我該如何給視圖控制器提供圖像和幀?我怎麼會通過它? – adit

+1

您可以將其存儲在實例變量中,稍後在'viewDidLoad'中使用。 –

相關問題