2013-08-19 58 views
0

我有一個回合制遊戲,允許用戶同時玩很多比賽。轉了一圈之後,用戶可以點擊「轉到下一個匹配」按鈕。重新加載UIViewController和Dealloc

單擊按鈕時,我只是創建一個新的GameViewController,並將其按下。但是,在執行此操作時,舊的GameViewController將不會釋放,並且有時會干擾新的viewController(與執行在oldView控制器上增加分數的塊一樣,會增加新控件的分數)。

我想推新視圖控制器而不是核彈並清理舊視圖並重新使用它的原因是因爲我想要推動動畫,並且出於安全原因,我想要一個乾淨的視圖。

所以我想當創建和推動一個新的viewcontroller,它不是一個真正的新的,但舊的。

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil]; 
      GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"]; 
      gameViewController.matchObject = match; 
      [weakSelf.navigationController pushViewController:gameViewController animated:YES]; 

在此先感謝

+1

你有沒有在dealloc方法中試過NSLog,看它是否被調用? – ahmedalkaff

回答

1

你推GameViewController新實例,但舊的控制器將不會被破壞,因爲它存儲在導航控制器的堆棧。存在潛在的內存泄漏 - 如果您爲每個回合推送新的控制器並且永遠不會彈出它。

通過更改UINavigationController.viewControllers屬性,您可以在新控制器動畫完成後直接更新導航堆棧。 (例如像

// I assume you using ARC. 
NSMutableArray *temp = [NSMutableArray array]; 
[temp addObjectsFromArray:self.navigationController.viewControllers] 
[temp removeObjectAtIndex:temp.count - 2]; 
self.navigationController.viewControllers = [temp copy]; 

但這種方法不給我看起來不錯反正)

你可以用漂亮的推動過渡沒有導航控制器,請看CATransition類。

+0

謝謝!這工作。儘管需要設置刪除的延遲,並讓新的加載。 – BlackMouse

0

如果你只是把一個新的視圖控制器舊視圖控制器仍然會在那裏。它不會被看到,因爲新的是最重要的。你可以嘗試這樣的事情(假設你是不是已經移除別的地方舊的視圖控制器):

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle: nil]; 
GameViewController *gameViewController = (GameViewController *)[mainStoryboard instantiateViewControllerWithIdentifier: @"GameViewController"]; 
gameViewController.matchObject = match; 
[weakSelf.navigationController popViewControllerAnimated:NO]; 
[weakSelf.navigationController pushViewController:gameViewController animated:YES]; 
+0

我相信當前的視圖控制器會在這行''[weakSelf.navigationController popViewControllerAnimated:NO]'後面被銷燬;',最好使用'strong'變量。 –

+0

這不是OP想要的嗎?他希望dealloc被調用,所以我認爲他希望它被銷燬。 – Kevin

+0

行['weakSelf.navigationController popViewControllerAnimated:NO];'行[weakSelf.navigationController pushViewController:gameViewController animated:YES];'沒有意義,因爲'weakSelf'將是零,他將無法訪問'navigationController' –

相關問題