2014-03-30 64 views
3

簡單的問題後,我已經定義了一個UIImageView,叫bigImageView在一個UIViewController用故事板, 它在的UIViewController的.h文件聲明如下:IBOutlet中是零的initWithCoder被稱爲

@property (retain, nonatomic) IBOutlet UIImageView *bigImageView; 

appDelegate我地初始化的UIViewController如下:

imageViewController = [storyboard instantiateViewControllerWithIdentifier:@"chosenImageController"]; 

此呼籲的initWithCoder在我的UIViewController M檔:

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

該函數只被調用一次,所以沒有double init。 但是,後來,當我檢查我的bigImageView指針時,它仍然爲零。

是不是init應該爲它分配內存? 我認爲這就是爲什麼當我嘗試設置此UIImageview來保存UIImage時,它不顯示圖像 謝謝

+0

您的viewDidLoad或viewWillApear方法何時被調用? – Tander

+0

@Tander,我從另一個UIViewController中獲得了一個按鈕,該按鈕調用一個調用[self.navigationController pushViewController:imageViewController animated:YES]的函數; –

回答

-2

你並不需要定義的initWithCoder,因爲你在裏面有沒有定製邏輯。我會刪除該樣板代碼。

這裏是我會檢查:

  1. 在故事板,確保類視圖控制器的設置正確。
  2. 通過在@property附近尋找一個圓圈,確保插座正確地連接到故事板。它應該是一個圓圈,而不是一個圓圈的輪廓。
  3. 確保只有在調用viewDidLoad之後纔讀取該值。 Apple的唯一保證是在此方法調用之後設置插座。

更新:這聽起來像你想要加載視圖之前訪問圖像視圖。沒有辦法做到這一點。有一件事是致電viewController.view,這將強制視圖加載,但有很多原因不應該這樣做。

更好的方法是在您的視圖控制器上實現屬性,該屬性在視圖未加載和視圖加載時都適用。你可以看到一個優雅的解決方案in this question的例子。請注意,如果加載視圖,將通過didSet方法設置photographerLabel。另一方面,如果視圖未加載,則將通過viewDidLoad方法進行設置。對於該代碼的Objective-C版本或更多詳細信息,請參閱該問題中的鏈接視頻。

+0

initWithCoder是爲調試而定義的 –

+0

如果該類的名稱不正確,調試器將不會到達那裏;) –

+0

我看到關於viewDidLoad。但是隻有在實際顯示該控制器時才被調用。我希望能夠在顯示控制器 –

0

這一切都是如何工作的。首先,筆尖/故事板中的每個對象都會調用alloc/init,然後創建所有連接,然後調用viewDidLoad

您需要等待- (void)viewDidLoad在您的控制器上被調用,然後應該設置bigImageView。如果沒有設置,那麼你在故事板中做了錯誤的事情。

init方法不負責分配任何內存。所有內存都由alloc方法分配,該方法始終在init之前調用。 Alloc將使用nil/NULL/0值填充所有實例變量,然後init爲每個變量分配初始值(通常基於NSCoder對象的內容,但由您決定應該如何完成)。

但是,對於IB插座,這些通過初始化後的筆尖加載過程進行設置。

編輯:

// ViewControllerA.m: 
imageViewController = [storyboard instantiateViewControllerWithIdentifier:@"chosenImageController"]; 
imageViewController.image = imageToShow; 

// ViewControllerB.h 
@property (retain) NSImage *image; 
@property (retain, nonatomic) IBOutlet UIImageView *bigImageView; 

// ViewControllerB.m 
- (void)viewDidLoad 
{ 
    self.bigImageView.image = self.image; 

    [super viewDidLoad]; 
} 
+0

我有一個viewcontrollerA出現在那個之前,並在viewcontrollerA我選擇了一個圖像,這反過來應該設置圖像使用委託之前,我展示了我的第二個imageViewController。 –

+0

@Alon_T我已經更新了我的答案,向您展示瞭如何將圖像提供給下一個視圖控制器。請注意,所有這些代碼都會在GPU執行任何操作之前執行。 –