我使用以下命令打开一个新的视图控制器
ViewController *mainMenu = [self.storyboard instantiateViewControllerWithIdentifier:@"mainview"];
[self.navigationController pushViewController:mainMenu animated:NO];
当主视图在屏幕上处于活动状态时,应用程序仍在后台运行旧视图控制器(方法)。
如何阻止旧视图控制器运行或使其处于非活动状态?
答案 0 :(得分:0)
如果你的意思是之前处于活动状态的视图控制器仍在执行代码,我建议在推送之前执行以下操作将其从视图和执行中删除:
ViewController *mainMenu = [self.storyboard instantiateViewControllerWithIdentifier:@"mainview"];
[self.navigationController popViewControllerAnimated: NO]; // Takes the old one away
[self.navigationController pushViewController:mainMenu animated:NO];
答案 1 :(得分:0)
首先,让我们自问:在视图控制器上运行什么样的方法?
我打算将属于UIViewController
子类的方法分为4类(尽管这些类别之间明显重叠)。
viewDidLoad
,viewWillAppear:
等方法,它们作为视图控制器生命周期的一部分运行。如果视图是“在后台”,除了可以说,viewDidLoad
,viewWillAppear:
在视图到达前景之前在技术上被调用,并且{{1},这些方法都不应该运行在视图离开前景后技术上调用的。所以我们真的不必担心这些。viewDidDisappear:
只能invalidate
}}。所以你在视图控制器上有“在后台运行”的方法。他们属于哪个类别?
如果他们属于第一类,那么你要么从某个地方手动调用一个生命周期方法(我不能推荐这么做 - 没有充分的理由这样做),或者你可能没有不了解viewDidDisappear:
生命周期。
如果他们属于第二类,那么他们被调用的可能性很大。如果对象A由视图控制器A委派,并且对象A仍然在处理某个进程并且仍然需要委派,则视图控制器A仍在响应委派方法时,这一点非常重要。如果您不希望发生这种情况,则需要停止对象A的请求委派。
如果它们属于第三类,则在适当时使UIViewController
个对象无效。 NSTimer
并不只是神奇地没有做你预定的事情。如果您不希望它在视图控制器的视图不可见时调用视图控制器上的方法,则必须在NSTimer
中invalidate
{/ 1}}。
如果他们属于第四类,请首先确保您没有从视图控制器外部手动调用的公共方法。如果你这样做,那就停止打电话给他们。如果不这样做,请仔细检查前三个类别。