如何删除以前的ViewController

Kir*_*rby 13 memory-management objective-c uiviewcontroller ios swift

我是一名学生,对编程很陌生.我想在业余时间学习Objective-C/Swift.我使用带有多个菜单/场景的swift的spriteKit制作了一个游戏.

我正试图从一个视图控制器转换到另一个视图控制器.为此,我使用了以下代码:

@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)
}
Run Code Online (Sandbox Code Playgroud)

这适用于转换到新的VC场景,但是,我相信以前的VC仍然在堆栈中并占用内存,从而减慢了我的程序.

我已阅读其他一些帖子,您可以使用导航控制器删除VC.但是,我没有导航控制器; 只查看控制器.我已经看过一些关于removeFromParentViewController()和的 东西view.removeFromSuperview(),但我真的不知道如何实现它.除此之外,我没有找到我正在寻找的答案.

所以我要问的问题是如何从堆栈中删除以前的VC?任何帮助将是一个赞赏!(希望帮助很快,但Objective-C也有帮助)提前谢谢!

备注供参考:我相信Objective-C我的代码看起来像这样:

-(IBAction) PlayButtonPressed: (id) sender {
    UIStoryboard *playStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *vc = [playStoryboard instantiateViewControllerWithIdentifier:@"playGame"];
    [self presentViewController:vc animated:YES completion:nil];
}
Run Code Online (Sandbox Code Playgroud)

Kee*_*nle 16

我可以假设,屏幕上显示的视图控制器是从主故事板自动实例化或通过设置应用程序的window.rootViewController属性实例化的.

在任何一种情况下,您都可以rootViewController再次设置为您的vc.要更改应用程序的rootViewController,您需要替换以下代码行:

self.presentViewController(vc, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

......下面有一个选项.

没有过渡动画的"导航":

Objective-C的

UIWindow *window = (UIWindow *)[[UIApplication sharedApplication].windows firstObject];
window.rootViewController = vc;
Run Code Online (Sandbox Code Playgroud)

迅速

let window = UIApplication.sharedApplication().windows[0] as UIWindow;
window.rootViewController = vc;
Run Code Online (Sandbox Code Playgroud)

使用过渡动画"导航":

Objective-C的

UIWindow *window = (UIWindow *)[[UIApplication sharedApplication].windows firstObject];
[UIView transitionFromView:window.rootViewController.view
                    toView:vc.view
                  duration:0.65f
                   options:UIViewAnimationOptionTransitionCrossDissolve // transition animation
                completion:^(BOOL finished){
                    window.rootViewController = vc;
                }];
Run Code Online (Sandbox Code Playgroud)

迅速

let window = UIApplication.sharedApplication().windows[0] as UIWindow;
UIView.transitionFromView(
    window.rootViewController.view,
    toView: vc.view,
    duration: 0.65,
    options: .TransitionCrossDissolve,
    completion: {
        finished in window.rootViewController = vc
    })
Run Code Online (Sandbox Code Playgroud)

备注: 一旦rootViewController值改变,原始视图控制器引用计数应该变为0,因此它将从内存中删除!


Dim*_*ima 1

首先,您使用的是模态表示模式,而不是导航堆栈模式 ( UINavigationController)。您无法也不应该摆脱呈现视图控制器,因为它会破坏导航。

简而言之,您无需担心这一点。视图控制器本身占用的内存量是微不足道的,一旦不再有对它的引用(您将其关闭或将其从导航堆栈中弹出),它将自动释放。

较长的答案取决于您的具体实施。如果您处于无限增加堆栈大小的情况,那么这就是一个问题。一个例子是,如果您有一个导航流程,您可以在两个“屏幕”之间自由移动,但在内部每个屏幕都会不断呈现一个新屏幕,而不仅仅是切换到现有屏幕。如果您遇到类似的情况,那么您最适合使用UITabBarController或类似的东西,您可以在视图控制器之间横向导航而无需创建新的控制器。