Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIViewController在后台保持活动状态_Ios_Objective C_Uiviewcontroller - Fatal编程技术网

Ios UIViewController在后台保持活动状态

Ios UIViewController在后台保持活动状态,ios,objective-c,uiviewcontroller,Ios,Objective C,Uiviewcontroller,我使用以下命令打开一个新的视图控制器 ViewController *mainMenu = [self.storyboard instantiateViewControllerWithIdentifier:@"mainview"]; [self.navigationController pushViewController:mainMenu animated:NO]; 当主视图在屏幕上处于活动状态时,应用程序仍在后台运行旧的视图控制器方法 如何停止旧的视图控制器运行或使其处于非活动状态?如果您

我使用以下命令打开一个新的视图控制器

ViewController *mainMenu = [self.storyboard instantiateViewControllerWithIdentifier:@"mainview"];
[self.navigationController pushViewController:mainMenu animated:NO];
当主视图在屏幕上处于活动状态时,应用程序仍在后台运行旧的视图控制器方法


如何停止旧的视图控制器运行或使其处于非活动状态?

如果您的意思是,以前处于活动状态的视图控制器仍在执行代码,我建议在按下之前执行以下操作以将其从视图和执行中删除:

ViewController *mainMenu = [self.storyboard instantiateViewControllerWithIdentifier:@"mainview"];
[self.navigationController popViewControllerAnimated: NO]; // Takes the old one away
[self.navigationController pushViewController:mainMenu animated:NO];

首先,让我们问问自己:在视图控制器上运行什么样的方法

我将把UIViewController子类中的方法分为4个类别,尽管这些类别之间有明显的重叠

生命周期方法。这些方法(如viewDidLoad、ViewWillAspect:)作为视图控制器生命周期的一部分运行。如果视图位于后台,则这些方法都不应运行,可以说,除了viewDidLoad、ViewWillExample(在视图到达前台之前技术上调用)和ViewDidEnglishe(在视图离开前台之后技术上调用)之外。所以我们真的不需要担心这些。 委托方法。视图控制器可以委托对象。每当委托的对象调用委托方法时,就会在视图控制器上调用委托方法。在大多数情况下,我们讨论的是委托某种UI元素,它是视图控制器的一部分。这个UI元素在视图控制器运行的任何时候都会在后台,所以它不应该调用委托方法。 NSTimer调用了方法。NSTimer可以保持对对象的强引用,并保持该对象处于活动状态,直到触发时间结束并调用该对象上的指定方法为止。即使视图控制器在后台,也很可能调用这些方法,但是如果要在视图控制器的视图不可见时停止计时器的运行,则只需在ViewDidDemove:中使其无效即可。 杂项方法。这些方法不一定属于上述任何类别,尽管它们可以。大多数时候,这些方法都是从视图控制器本身内部调用的,因此,如果没有从前三个类别中的一个类别调用任何内容,除非该方法是公共的,否则很少调用该类别。 因此,您已经在视图控制器的后台运行了一些方法。他们属于哪一类

如果它们属于第一类,那么要么您是在某个地方手动调用一个生命周期方法,我建议您不要这么做,因为没有充分的理由这样做,要么您不了解UIViewController的生命周期

如果他们属于第二类,那么他们很可能会被召唤。如果对象A由视图控制器A委派,而对象A仍在处理某个进程,并且仍然需要委派,那么视图控制器A仍在响应委派方法是非常重要的。如果不希望发生这种情况,则需要停止对象要求委托

如果它们属于第三类,请在适当的时候使NSTimer对象无效。NSTimer并不是神奇地不做您计划它要做的事情。如果不希望它在视图不可见时调用视图控制器上的方法,则必须在ViewDidEnglishe中使其无效


如果它们属于第四类,请首先确保没有从视图控制器外部手动调用的公共方法。如果你这么做了,我们就别再给他们打电话了。如果没有,请仔细检查前三个类别。

我们需要更多的详细信息。你说它仍然运行旧的视图控制器是什么意思?当应用程序的后台运行时,不应该运行任何东西。我假设询问者的意思是,当视图控制器A位于相对于视图控制器B的后台时,两者都是同一应用程序的视图控制器。