2010-11-09 66 views
3

我有一個簡單的UINavigationViewController,當某個項目被選中時創建一個模式視圖,其中有一個UIImageView(PostcardViewController在下面) 在裏面。但是,如果我叫iOs:爲什麼IBOutlet在[[alloc] init]之後沒有連線,但是在viewDidUnload:之後被調用

PostcardViewController *postcardViewController = [[PostcardViewController alloc] init]; 
postcardViewController.imageView.image = image; 
[self.navigationController presentModalViewController:postcardViewController animated:YES]; 

postcardViewController.imageView是nill,圖像永遠不會顯示。如果我切換後兩條線,並使其:

PostcardViewController *postcardViewController = [[PostcardViewController alloc] init]; 
[self.navigationController presentModalViewController:postcardViewController animated:YES]; 
postcardViewController.imageView.image = image; 

postcardViewController.imageView設置,它顯示了罰款。一切都在Interface Builder中進行了連接,PostcardViewController中沒有任何特定的代碼。通過調試,我發現,在調用[viewDidLoad]之後,imageView已連線,[viewDidLoad]在我調用[presentModalViewController]時被調用。

這是爲什麼,而且我在這裏做錯了什麼?我想我應該在實際展示之前設置整個視圖,但現在,我必須在完全設置之前展示它。

回答

7

您只使用alloc + init創建視圖控制器,而不是視圖本身。視圖被延遲加載,即第一次使用它。要在實際顯示之前強制創建視圖,請執行以下操作:

PostcardViewController *postcardViewController = [[PostcardViewController alloc] init]; 
postcardViewController.view; // Forces the view to be loaded 
postcardViewController.imageView.image = image; // Will no longer be nil 
[self.navigationController presentModalViewController:postcardViewController animated:YES]; 
4

插座是零,因爲初始化控制器不加載nib/xib。只有在視圖屬性被訪問後(比如當呈現時)纔是加載並連接到控制器的筆尖。

PostcardViewController有責任在viewDidLoad中設置imageView的圖像。創建一個圖像屬性來傳遞UIImage。

PostcardViewController *pvc= [[PostcardViewController alloc] init]; 
pvc.image = image; 
[self.navigationController presentModalViewController:pvc animated:YES]; 
[pvc release]; 

在PostcardViewController.h

... 
    UIImage *image 
} 
@property (nonatomic, retain) UIImage *image; 

在PostcardViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    imageView.image = image; 
} 
4

這是因爲UIViewControllers加載自己的看法懶洋洋地。因此,直到您真正嘗試呈現視圖纔會加載視圖。

相關問題