如何删除以前的ViewController
我是一名学生,编程相当新颖。 我正在尝试在业余时间学习Objective-C / 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) }
这适用于转换到新的VC场景,但是,我相信以前的VC仍然在堆栈中占用内存,减慢了我的程序。
我读过其他一些post,你可以使用导航控制器来删除VC。 但是,我没有导航控制器; 只查看控制器。 我已经看到一些关于removeFromParentViewController()
和view.removeFromSuperview()
,但我真的不知道如何实现它。 除此之外,我没有find我正在寻找的答案。
所以我问的问题是如何从堆栈中删除以前的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]; }
正如我可以假设,在屏幕上呈现的视图控制器实例化自动从主故事板或通过设置应用程序的window.rootViewController
属性。
在这两种情况下,你可以再次设置rootViewController
是你的vc
。 要更改你的应用程序的rootViewController,你需要replace这行代码:
self.presentViewController(vc, animated: true, completion: nil)
…下面的选项之一。
没有过渡animation的“导航”:
Objective-C的
UIWindow *window = (UIWindow *)[[UIApplication sharedApplication].windows firstObject]; window.rootViewController = vc;
迅速
let window = UIApplication.sharedApplication().windows[0] as UIWindow; window.rootViewController = vc;
使用过渡animation“导航”:
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; }];
迅速
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 })
备注:一旦rootViewController值被改变,你的原始视图控制器引用计数应该变为0,因此它将被从内存中删除!
我想最好的实现是把以下视图控制器 – 斯威夫特
// Override to remove this view from the navigation stack override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) // Remove self from navigation hierarchy guard let viewControllers = navigationController?.viewControllers, let index = viewControllers.indexOf(self) else { return } navigationController?.viewControllers.removeAtIndex(index) }
首先,您使用的是模式表示模式,而不是导航堆栈模式( UINavigationController
)。 你不能摆脱提出的视图控制器,也不应该,因为它会打破导航。
这里的简短答案是,你不必担心这一点。 视图控制器本身所占用的内存量是微不足道的,一旦没有更多的引用(一个是closures它或从导航堆栈中popup),它将自动释放。
更长的答案将取决于您的具体实施。 如果你在某种情况下无限增加堆栈的大小,那么这是一个问题。 一个例子是,如果你有一个导航stream程,你可以在两个“屏幕”之间自由移动,但内部每个屏幕不断地呈现一个新的,而不是只是切换到现有的。 如果你遇到这样的事情,那么你将最适合使用UITabBarController
或类似的东西,你可以在视图控制器之间进行横向导航而不需要创build新的视图控制器。
对于SWIFT 3,你可以更换
self.present(ViewController(), animated: false, completion: nil);
同
if let window = UIApplication.shared.keyWindow{ window.rootViewController = UINavigationController(rootViewController: ViewController()); }