我是一名学生,而且很新颖的编程.我在业余时间尝试学习Objective-C /
Swift.我做了一个游戏,使用spriteKit与swift有多个菜单/场景.
我试图从一个视图控制器转换到另一个视图控制器.为此,我使用了这个代码:
@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仍然处于堆栈并占用内存,从而减慢了我的程序.
我已经阅读了其他一些帖子,您可以使用导航控制器删除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]; }
解决方法
我可以假设,在屏幕上呈现的视图控制器可以从主故事板自动或通过设置应用程序的window.rootViewController属性实例化.
在任一情况下,您可以将rootViewController再次设置为您的vc.要更改您的应用程序的rootViewController,您需要替换此代码行:
self.presentViewController(vc,completion: nil)
…与下面的选项之一.
“导航”无转换动画:
Objective-C的
UIWindow *window = (UIWindow *)[[UIApplication sharedApplication].windows firstObject]; window.rootViewController = vc;
迅速
let window = UIApplication.sharedApplication().windows[0] as UIWindow; window.rootViewController = vc;
使用转换动画“导航”:
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,因此将从内存中删除!