UIViewController在后台保持活跃状态

时间:2014-06-12 22:51:51

标签: ios objective-c uiviewcontroller

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

ViewController *mainMenu = [self.storyboard instantiateViewControllerWithIdentifier:@"mainview"];
[self.navigationController pushViewController:mainMenu animated:NO];

当主视图在屏幕上处于活动状态时,应用程序仍在后台运行旧视图控制器(方法)。

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

2 个答案:

答案 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类(尽管这些类别之间明显重叠)。

  1. 生命周期方法。这些是viewDidLoadviewWillAppear:等方法,它们作为视图控制器生命周期的一部分运行。如果视图是“在后台”,除了可以说,viewDidLoadviewWillAppear:在视图到达前景之前在技术上被调用,并且{{1},这些方法都不应该运行在视图离开前景后技术上调用的。所以我们真的不必担心这些。
  2. 委派方法。您的视图控制器可以委派对象。只要委托的对象调用它们,就会在视图控制器上调用委托方法。在大多数情况下,我们讨论的是委托某种UI元素,它是视图控制器的一部分。这个UI元素在视图控制器的任何时候都是“在后台”,因此它不应该调用委托方法。
  3. NSTimer调用方法。 NSTimer可以保持对对象的强引用,并保持该对象存活,直到触发时间结束并且它调用该对象上的指定方法。即使视图控制器在后台,这些方法肯定可能被调用,但如果你想在视图控制器的视图不可见的情况下停止运行计时器,那么viewDidDisappear:只能invalidate }}。
  4. 其他方法。这些方法不一定属于上述任何类别(尽管它们可以)。大多数情况下,调用这些方法都来自视图控制器本身,因此如果从前三个类别之一调用任何内容,则很少会调用此类别(除非该方法是公共的)。
  5. 所以你在视图控制器上有“在后台运行”的方法。他们属于哪个类别?

    如果他们属于第一类,那么你要么从某个地方手动调用一个生命周期方法(我不能推荐这么做 - 没有充分的理由这样做),或者你可能没有不了解viewDidDisappear:生命周期。

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

    如果它们属于第三类,则在适当时使UIViewController个对象无效。 NSTimer并不只是神奇地没有做你预定的事情。如果您不希望它在视图控制器的视图不可见时调用视图控制器上的方法,则必须在NSTimerinvalidate {/ 1}}。

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