2013-02-18 93 views
12

我有一個詳細視圖控制器下面的代碼:方法稱爲-viewWillLayoutSubviews莫名其妙地運行兩次

- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    [self configureView]; 
} 

當我Segue公司這種觀點與上-configureView第一線斷點控制器,看來[self configureView]被調用兩次。但是:

  • 這兩次的方法打,堆棧看起來是這樣的:

stack

  • 當我在上面的代碼註釋[self configureView],它擊中零次。
  • 由於堆棧在兩次都是相同的,所以-configureView不會遞歸調用它自己。
  • -configureView僅在上述代碼中調用。
+0

因此'viewWillLayoutSubviews'被調用兩次?那麼問題是觸發視圖控制器中重新佈局的是什麼? – abellina 2013-02-18 22:44:20

+0

是的,好點。問題是,爲什麼'-viewWillLayoutSubviews'被調用兩次。以完全相同的方式在堆棧上。 – 2013-02-18 22:59:54

回答

1

如果按照通常的模式,那麼在detailItem的setter中調用configureView。檢查setter方法。並且[detailViewController setDetailItem:something]通常在prepareForSegue:中被調用。

重點是:它有什麼關係嗎?

+1

我在'-viewWillLayoutSubviews'中調用它,因爲我希望每次佈置視圖時都要從模型更新值。在setter中調用它會產生更多結構上的意義,但會導致視圖在segue之前不會更新,從而導致陳舊的數據呈現。無論如何是的,這似乎很重要!首先,我想了解這種行爲。另外,如果我想用這種方法進行密集操作呢?爲什麼要執行兩次? – 2013-02-18 23:05:32

+1

我沒有說你必須從setter中調用它。我只想提示你可能實際上也會從setter中調用它,這可能會導致它被調用兩次。就這樣。但是,我不相信這是從模型中刷新數據的適當位置。 viewWillAppear應該足以達到這個目的。 – 2013-02-19 00:24:37

+0

謝謝赫爾曼!我會在這裏看看報告。我正在思考如何引用,「程序員浪費了大量時間思考或擔心其程序的非關鍵部分的速度......」Knuth(http://c2.com/cgi/wiki?PrematureOptimization) 。我只是想確保我理解所有這些方法如何掛接到運行時。感謝您指出'viewWillAppear' – 2013-02-19 03:26:52

11

Apple's documentation

的viewWillLayoutSubviews方法的視圖的大小和位置由它的父之後也被稱爲。鑑於viewWillLayoutSubviews

每當bounds變化對控制器的觀點,也不能保證它會一次只調用被調用。例如,每當發生旋轉時它都會被調用。

configureView方法可能會更好,從別的地方調用,也許在viewWillAppearviewDidAppear或者甚至BirdDetail項自定義突變爲每Hermann's suggestion

相關問題