2014-06-12 63 views
1

我用下面當MAINVIEW在屏幕上活動的應用程序仍然在後臺運行舊視圖控制器(方法)來打開一個新的視圖控制器UIViewController中保持活躍的背景

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

我怎麼能停止運行舊的視圖控制器或使之失去活性?

+0

我們需要比這更多的細節。你是什​​麼意思,它「仍然運行舊視圖控制器」?當應用程序的後臺沒有任何應該運行。 –

+0

我假定Asker意味着當View Controller A在相對於View Controller B的背景中時,它們都是同一個應用程序的視圖控制器。 – nhgrif

回答

0

首先,讓我們問自己這個:在視圖控制器上運行什麼樣的方法?

我打算將UIViewController子類的一部分的方法分爲4類(儘管這些類別之間有明顯的重疊)。

  1. 生命週期方法。這些方法是作爲視圖控制器生命週期一部分運行的方法,如viewDidLoad,viewWillAppear:等。如果視圖是「在後臺」,而不是視圖處於前景的技術上調用的viewDidLoad,viewWillAppear:以及技術上在視圖離開視圖之後才調用的viewDidDisappear:,則這些方法都不應運行前景。所以我們並不需要擔心這些。
  2. 委託方法。你的視圖控制器可以委託對象。只要委託對象調用它們,委託方法就會在您的視圖控制器上調用。在大多數情況下,我們討論的是委託某種UI元素,它是視圖控制器的一部分。這個UI元素在任何時候視圖控制器都是「在後臺」,所以它不應該調用委託方法。
  3. 的NSTimer調用的方法。 NSTimer可以保持對一個對象的強引用,並保持這個對象一直存在,直到消息時間結束,並調用該對象的指定方法。即使視圖控制器在後臺,這些方法肯定可能會被調用,但是如果您想要在視圖控制器的視圖不可見的情況下停止定時器運行,那麼只需invalidate即可,它位於viewDidDisappear:
  4. 其他方法。這些方法並不一定要納入上述任何類別(儘管它們可以)。大多數情況下,這些方法都是從視圖控制器本身調用的,所以如果沒有任何內容從前三個類別中調用,那麼調用此類別(除非方法是公共的)將很少。

所以你已經有方法在視圖控制器上運行「在後臺」。他們屬於什麼類別?

如果他們在第一個類別中,那麼要麼從某個地方手動調用生命週期方法(我不能推薦反對 - 沒有充足的理由這樣做),或者您不瞭解UIViewController的生命週期。

如果他們在第二類中,那麼它是最有可能好,他們會被調用。如果對象A由View Controller A委託並且對象A仍在處理某個進程並仍然需要委派,那麼視圖控制器A仍在響應委派方法是非常重要的。如果您不希望發生這種情況,則需要停止對象A的委派。

如果它們處於第三類,則在適當時使NSTimer對象無效。 NSTimer不只是神奇不會做你計劃做的事情。如果您不希望它在視圖控制器的視圖不可見時調用視圖控制器上的方法,您必須invalidate它在viewDidDisappear中。

如果他們在第四類中,首先確保你沒有公開的方法,你從視圖控制器之外手動調用。如果你這樣做,不要打電話給他們。如果你不這樣做,請仔細檢查前三類。

0

如果你的意思是說之前已經激活的視圖控制器仍然執行代碼,我建議做以下操作前推從視圖和執行其刪除:

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