2010-02-17 33 views
24

我試圖從蘋果的sketchy文檔中找出哪種方法是最好的地方是初始化和添加我的視圖控制到控制器的視圖。我是否以編程方式在ViewDidAppear,ViewDidLoad,ViewWillAppear,構造函數中添加SubViews?

使用winforms,它非常簡單,因爲它們始終在InitializeDesigner內初始化,在構造函數中調用。如果可能的話,我試圖匹配這種模式的可靠性。

大部分時間裏,我正在與UIViewControllersUITableViewControllers一起使用UINavigationController - 如果這會影響一切。

下面是一個例子:

public MyController() 
{ 
    // Here? 
    AddViews(); 
} 

public override ViewDidLoad() 
{ 
    base.ViewDidLoad(); 

    // Or is should it be here? 
    AddViews(); 
} 

public override ViewWillAppear(bool) 
{ 
    base.ViewWillAppear(animated); 

    // Here? 
    AddViews(); 
} 

public override ViewDidAppear(bool animated) 
{ 
    base.ViewDidLoad(animated); 

    // Or maybe here? 
    AddViews(); 
} 

void AddViews() 
{ 
    UILabel label = new UILabel(); 
    label.Text = "Test"; 
    label.Frame = new RectangleF(100,100,100,26); 
    View.AddSubView(label); 

    UIWebView webview = new UIWebView(); 
    webview .Frame = new RectangleF(100,100,100,26); 
    View.AddSubView(webview); 
} 

我得到了一些UIControls混合的結果,當我將它們添加到在不同的地方查看。視覺滯後有時,othertimes webview被隱藏在某處。

是否有一個通用規則來保持添加它們?

+2

另請參閱:http://stackoverflow.com/questions/573958/iphone-sdk-what-is-the-difference-between-loadview-and-viewdidload – 2010-02-17 13:05:29

回答

70

在一般情況下,這是我做的:

  • viewDidLoad中 - 每當我添加控件應該與視圖一起出現一個視圖,馬上,我把它放在viewDidLoad中方法。基本上這個方法在視圖加載到內存時被調用。例如,如果我的視圖是一個帶有3個標籤的表單,我會在這裏添加標籤;如果沒有這些形式,視圖將永遠不會存在

  • ViewWillAppear:我使用ViewWillAppear通常只是爲了更新表單上的數據。因此,對於上面的示例,我將使用它實際將我的域中的數據加載到表單中。創建UIViews相當昂貴,你應該儘可能地避免在ViewWillAppear方法上做這件事,因爲當它被調用時,這意味着iPhone已經準備好向用戶展示UIView,並且你在這裏做的任何事情都很重會以非常明顯的方式影響性能(如動畫被延遲等)。

  • ViewDidAppear:最後,我用的是ViewDidAppear,開始一個新的線程的事情,需要很長的時間來執行,例如像做一個Web服務調用,以獲得額外的數據,上面的表格。好處是,因爲視圖已經存在並且正在顯示給用戶,所以當您獲取數據時,您可以向用戶顯示一個很好的「等待」消息。

雖然有其他的技巧可以使用。比方說,你想要一個UILabel在表單加載後「飛」到表單中。在這種情況下,我會將標籤添加到ViewDidLoad中的窗體中,但在視圖區域之外添加一個Frame,然後在ViewDidAppear中,我將執行動畫以將其返回到視圖中。

希望它有幫助。

+0

謝謝,這是清除了很多。我一直無法添加任何與這個問題的LoadView示例:http://stackoverflow.com/questions/573958/iphone-sdk-what-is-the-difference-between-loadview-and-viewdidload - 做你曾經使用過這種方法嗎? – 2010-02-17 15:55:44

+1

所以基本上loadView是UIViewController的一種方法(當你試圖弄清這些事情時使用rosetta stone - http://tirania.org/tmp/rosetta.html)。 框架會自動在控制器中調用此方法來告訴它創建視圖,然後UIViewController的默認實現將調用ViewDidLoad。雖然可以重寫此方法(並確保在您執行時調用基本方法),但個人而言,我更願意只使用viewWillLoad(在loadView之前調用)和viewDidLoad(稍後調用)。 – 2010-02-17 16:51:17

+0

@eduardo,文檔建議不要打電話超級loadView – 2014-02-02 18:19:50

8

嗯,蘋果的文件似乎很清楚,恕我直言。

如果你創建自己的根視圖(這個特殊的控制器的視圖層次的根視圖)編程,你應該-loadView創建時不調用super並在完成後設置view屬性。如果您的視圖是從筆尖加載的,則不應觸摸-loadView

您可以將自定義子視圖添加到視圖控制器的視圖中,或者在-viewDidLoad中修改它。建議的做法是在-viewDidLoad中創建您的UILabel和UIWebView,並在-viewDidUnload中釋放它們,如果需要將它們保留在ivars中,請將它們的引用設置爲nil

注意:-viewDidUnload已在iOS 6中棄用,因爲UIViewController不再在內存壓力下清除其視圖。

+0

謝謝我錯過了這個方法。不過,我仍然覺得我列出的方法只能提供何時使用它們的非常有限的信息。即使在loadView中,所有被告知的都是*'如果您想對視圖執行任何額外的初始化,請在viewDidLoad方法中執行此操作' - - 何時您需要此方法? – 2010-02-17 13:04:37

+0

loadView是從NIB加載視圖層次結構的方法,或者在沒有加載NIB的情況下僅創建一個空的UIView的方法。您可能需要自定義視圖而不是它,在這種情況下,您會覆蓋loadView。例如,UITableViewController重寫此方法以創建UITableView。我經常發現自己用我自己的UIView子類來做同樣的事情。 – Costique 2010-02-17 20:10:18

+0

viewDidUnload已棄用 – 2015-04-26 20:45:09

2

viewDidLoad與'MEMORY'有關,而viewWillAppear/viewDidAppear與'APPEARANCE'有關。即使控制器的視圖已經在內存中,視圖控制器的視圖(它是視圖控制器視圖的根視圖)可能會出現/消失無數次。 (當提到根視圖時,我也意味着它的子視圖,因爲根視圖具有對子視圖的引用,但從視圖控制器的角度來看,它通常只知道根視圖。子視圖通常可以通過視圖控制器的網點發生。)

當存在內存警告時,可能會從內存中刪除根視圖本身。視圖控制器將確定何時是將它們從內存中移除的最佳時間。

因此,您通常會在viewDidLoad中添加子視圖,因爲添加子視圖意味着將它們添加到內存中。但是,如果您以編程方式創建所有視圖(而不是從nib文件)。如果是這種情況,那麼你應該重載loadView方法,並創建一個根視圖並在那裏添加子視圖,所以在這種情況下,你可以省略viewDidLoad來添加子視圖。

相關問題