I am a student and pretty new to programming. I am trying to learn Objective-C/Swift in my spare time. I made a game using spriteKit with swift that has multiple menus/scenes.
I am trying to transition from one view controller to another. To do this I used this code:
@IBAction func PlayButtonPressed(sender: AnyObject) {
let playStoryboard : UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc : UIViewController = playStoryboard.instantiateViewControllerWithIdentifier("playGame") as UIViewController
self.presentViewController(vc, animated: true, completion: nil)
}
This works for transitioning to the new VC scene, however, I believe the previous VC is still in the stack and takes up memory, slowing down my program.
I've read on some other posts that you can use the navigation controller to remove VC. However, I do not have a navigation controller; only view controllers. I've seen some stuff about removeFromParentViewController()
and view.removeFromSuperview()
, but I don't really know how to implement it. Other than that I did not find an answer that I was looking for.
So the question I am asking is how do I remove the previous VC from the stack? Any help would be a appreciated! (would prefer the help to be in swift, but Objective-C would help also) Thank you in advance!
note for reference: I believe in Objective-C my code would look something like this:
-(IBAction) PlayButtonPressed: (id) sender {
UIStoryboard *playStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [playStoryboard instantiateViewControllerWithIdentifier:@"playGame"];
[self presentViewController:vc animated:YES completion:nil];
}
For swift 3 you can replace
with
I guess best implementation is to place the following at the previous View Controller - Swift
Swift 3
This will remove the current view controller from the memor
First of all, you are using the modal presentation pattern, rather than a navigation stack pattern (
UINavigationController
). You can't get rid of the presenting view controller, nor should you, as it would break navigation.The short answer here is that you don't need to worry about this. The amount of memory a view controller itself takes up is trivial and will be released automatically once there are no more references to it (one you dismiss it or pop it off a navigation stack).
The longer answer would depend on your specific implementation. If you are somehow in a situation where you infinitely increasing the size of a stack, then it is a problem. An example would be if you have a navigation flow where you can freely move between two "screens" but internally each screen keeps presenting a new one rather than just switching to an existing one. If you are experiencing something like this, then you would be best suited to using a
UITabBarController
or something similar, where you are able to navigate laterally between view controllers without creating new ones.As I can assume, view controller being presented on the screen was instantiated either automatically from main storyboard or by setting app's
window.rootViewController
property.In either case you can set
rootViewController
again to be yourvc
. To change rootViewController of your app you need to replace this line of code:... with one of the options bellow.
"Navigate" without transition animation:
Objective-C
Swift
"Navigate" with transition animation:
Objective-C
Swift
Remarks: Once rootViewController value gets changed your original view controller reference count should became 0 hence it will be removed from the memory!