2014-11-05 53 views
4

大家好,我在做Udemy的課程時間,代碼調用放置代碼在viewDidLoad中的功能,如下圖所示:代碼在viewDidLoad中運行,每次調用

override func viewDidLoad() { 
    super.viewDidLoad() 

    placesArray.append(["name":"Taj Mahal", "lat":"27.175607", "lon":"78.042112"]) 

} 

數組追加應該只運行然而,一次,當我繼續到另一個viewController並回來,它運行代碼再次追加。所以我現在有一排2行,兩個都是泰姬陵。

我認爲viewDidLoad函數只運行一次代碼?

有沒有辦法解決這個問題?

謝謝。

附錄: 我使用的是Swift,因此在創建和啓動viewController時沒有看到任何alloc和init。聽起來很奇怪,視頻教程在viewDidLoad中工作,教練正在使用故事板從初始表格視圖控制器延伸到視圖控制器上的地圖視圖,並且在地圖視圖上只有一個後退按鈕,即segue的通過故事板回到表格視圖控制器。 - 可能是因爲我有最新版本的Swift語言,並且培訓師使用的是早期版本(因爲我之前注意到在編碼方面存在一些細微差異),但您永遠不知道。無論哪種方式,只要他觸摸後退按鈕,它不會再運行附加代碼。 我試圖與培訓師接觸,因爲這裏的一些建議,雖然他們好似乎沒有工作。 一旦我接觸到培訓師,我會把解決方案放在這裏。

+0

也許當你繼續對其他viewController舊的是dealloc,當你回來它是再次加載?! – gran33 2014-11-05 15:02:27

+3

你可能會回來,但不會放鬆。你不應該那樣做。它創建一個新的實例,它實際上並沒有回來。 – rdelmar 2014-11-05 15:40:46

回答

1

當您的視圖控制器的view加載完成時調用viewDidLoad方法。 view將在視圖控制器的view屬性爲nil時加載並嘗試訪問它。

UIViewController *myVC = [[UIViewController alloc] init]; 
UIView *aView = myVC.view; // this loads myVC's view; viewDidLoad is called when it completes loading. 

如果view卸載了(通常是由於內存限制),將在view屬性在下一次訪問調用。

數據集的操作通常不應在視圖方法內完成。考慮將其移至視圖控制器的init(或轉至其他「數據源」類)。

+0

更具體地說。每當調用視圖控制器視圖的框架時,都會調用viewDidLoad。因此,例如,如果您將其框架大小設置爲容器大小,那麼viewDidLoad將會被擊中。但viewWillAppear&viewDidAppear不會在addSubview(或變體)之後被擊中。 – GnarlyDog 2014-11-05 15:22:15

+0

@GnarlyDog:不,這是不真實的。如果已經設置了'view'屬性,調用'self.view.frame = someFrame'不會導致'viewDidLoad'。例如,當您旋轉屏幕時,會設置'self.view.frame',但是除非您擦過了'view',否則每次旋轉都不會有'viewDidLoad'調用。 – 2014-11-05 15:33:14

+0

對不起,模糊的迴應。我特指你在分配初始化之後,並不是每次設置幀。我只是在另一個內部分配了一個ViewController,但沒有呈現它或將它的子視圖添加到視圖中。沒有調用viewDidLoad。但是,如果我設置view.frame = my.view.frame,然後調用viewDidLoad。但是viewWillAppear不是。實質上,viewDidLoad(和loadView)似乎被稱爲懶惰。 – GnarlyDog 2014-11-05 16:47:39

0

viewDidLoad只要設置了視圖控制器的視圖屬性就被調用。這是什麼時候發生的?這取決於視圖控制器是如何包含:

的UINavigationController - 因爲它們被添加到導航堆棧和「卸載」(雖然viewDidUnload方法已棄用),因爲它們被刪除視圖控制器視圖被加載。

UITabBarController - 視圖控制器視圖在添加到選項卡欄時加載,無論它們是否在屏幕上。它們會在您從標籤切換到標籤時保持加載狀態。

根據您的需求和用例,您可以創建自己的視圖控制器容器,它可以滿足您的需求。檢查蘋果文檔的正確方法來做到這一點: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

0

我想你試圖在viewDidLoad做數據初始化。如果在placesArray沒有其他操作之前viewDidLoad中,然後,而不是追加,那直接設置placesArray:

placesArray = ["name":"Taj Mahal", "lat":"27.175607", "lon":"78.042112"] 

那麼即使你的觀點被卸載了一些原因。泰姬陵仍然只能添加一次。