简体   繁体   中英

Code in viewDidLoad runs every time it is called

Hi all I am doing a course in Udemy, and the code calls for placing code in the viewDidLoad function as shown below:

    override func viewDidLoad() {
    super.viewDidLoad()

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

}

The array append should only run once, however, when I segue to another viewController and come back, it runs the code to append again. So I now have an array with 2 rows, both of which are Taj Mahal.

I thought that the viewDidLoad function only runs code once?

Is there a way around this?

Thanks.

Addendum: I am using Swift, so I don't see any alloc and init while creating and launching the viewController. And weird as it sounds, the video tutorial has it working in the viewDidLoad and the trainer is using the storyboard to segue from the initial table view controller to a map view on a view controller and just has a back button on the map view that segue's back to the table view controller via the storyboard as well. - Could be because I have the latest version of the Swift language and the trainer was using an earlier version, (cause I noticed some slight differences in coding earlier) but you never know. Either way whenever he touches the back button it does not run the append code anymore. I am trying to get in contact with the trainer as some of the suggestions here, though they are good don't seem to work. I will put the solution in here once I get in contact with the trainer.

The viewDidLoad method is called when your view controller's view finishes loading. The view will load when a view controller's view property is nil and something attempts to access it.

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

If the view has unloaded (usually due to memory limitations), it will be called when the view property is next accessed.

Manipulation of data sets should generally not be done within view methods. Consider moving this to the init of the view controller (or to a different "datasource" class).

viewDidLoad is called whenever the view controller's view property is set. When does this happen? It depends on how the view controller is contained:

UINavigationController - View Controller views are loaded as they are added to the navigation stack and "unloaded" (although the viewDidUnload method is deprecated) as they are removed.

UITabBarController - View Controller views are loaded as they are added to the tab bar regardless of whether they are on screen or not. They stay loaded as you change from tab to tab.

Depending on your needs and use case, you can create your own view controller container that does what you need. Checkout the Apple docs on the proper way to do this: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/CreatingCustomContainerViewControllers/CreatingCustomContainerViewControllers.html

I suppose you are trying to do data initialisation in viewDidLoad. If there is no other operation on placesArray before viewDidLoad, then instead of append, what about setting the placesArray directly:

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

Then even if your view is unloaded for some reasons. Taj Mahal will still be added once only.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM