我有一個類似於this question的問題,但它是MonoTouch特定的。當我需要調用NavigationController.PopToRootViewController()
時,我目前在堆棧中的第8個視圖控制器上,並且需要清除所有彈出的視圖控制器上的一堆內容(引用,事件,圖像等),以及我會這樣做嗎?如何在調用PopToRootViewController後清理視圖控制器?
回答
我結束了在每個視圖控制器上實現Cleanup()
方法。設置視圖控制器以觀察來自NSNotification.DefaultCenter
的某個通知。當時間到來PopToRootViewController()
然後發佈該通知事件。觀察這個通知的視圖控制器將被設置爲運行Cleanup()
,這將安全地清理所有的refs和內存。
您需要實施UIViewController.viewDidUnload()
方法,它在將視圖彈出到根或先行視圖時調用。 爲了讓您的應用程序更輕,您也可以管理UIViewController.View[Will|Did]Disappear()
中的一些控制器項目,但是您必須小心,因爲在將另一個視圖推向當前視圖時也會調用它們,因此請注意不要清潔您的項目依賴於你的視圖彈出回來。
我覺得有周圍的一些混亂時viewDidUnload被調用。根據[iOS](http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIViewController_Class/Reference/Reference.html)文檔,它只在低內存情況下被調用。我證實,當視圖彈出堆棧時,卸載並不總是被調用。實際上卸載並不明確指向UINavigationController。 –
你是對的'Andrew Young',並不保證每次從導航控制器彈出時都會調用'viewDidUnload'。 – thesummersign
感謝這些精度,我每次都會發誓它被稱爲,但它可能是一個巧合的問題。我會更加小心'關於未來的發展,謝謝你們兩位! – psycho
爲了達到這個目的,我傾向於繼承UINavigationController,以便在發送到超級視圖後攔截所有對popToRootViewController的調用。
popToRootViewController返回一個NSArray *,其中包含所有已從堆棧彈出的UIViewController,因此您可以將清理消息發送給它們。例如:
@interface BCNavigationController : UINavigationController
@end
@implementation BCNavigationController
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated {
NSArray * poppedControllers = [super popToRootViewControllerAnimated:animated];
[self sendPoppedMessageToControllers:poppedControllers];
return poppedControllers;
}
- (UIViewController *) popViewControllerAnimated:(BOOL)animated {
UIViewController * poppedController = [super popViewControllerAnimated:animated];
[self sendPoppedMessageToControllers:[NSArray arrayWithObject:poppedController]];
return poppedController;
}
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated {
NSArray * poppedControllers = [super popToViewController:viewController animated:animated];
[self sendPoppedMessageToControllers:poppedControllers];
return poppedControllers;
}
- (void) sendPoppedMessageToControllers:(NSArray *)controllers {
for (UIViewController * controller in controllers)
{
if ([controller respondsToSelector:@selector(viewWasPoppedOffStack)])
[controller performSelector:@selector(viewWasPoppedOffStack)];
}
}
@end
......然後,在你的孩子的UIViewController
// MyViewController.m
- (void) viewWasPoppedOffStack {
// do some cleanup
}
- 1. 如何推視圖控制器到導航堆棧後,在執行popToRootViewController
- 2. 如何調用視圖控制器與導航控制器
- 3. 如何處理視圖控制器?
- 4. 在拆分視圖控制器:調用詳細視圖控制器方法從主視圖控制器
- 5. 如何從嵌入導航控制器的簡單視圖控制器調用標籤欄視圖控制器?
- 6. 如何在視圖或其他控制器中調用控制器方法?
- 7. UIViewController -dealloc在關閉模態視圖控制器後調用
- 8. shouldAutorotateToInterfaceOrientation只是在呈現視圖控制器後調用
- 9. C#清潔視圖控制器
- 10. 視圖控制器未被清除
- 11. 如何在將控件傳遞給視圖後調試ASP.NET MVC控制器?
- 12. 在拆分視圖控制器中調整主視圖控制器和詳細視圖控制器的大小?
- 13. 如何在部分視圖中從ActionLink調用父控制器
- 14. ZF2如何調用控制器對象在視圖文件
- 15. 如何在視圖中調用控制器中的方法?
- 16. 如何在不同的視圖控制器中調用tableview?
- 17. 如何在調用applicationDidBecomeActive時告訴活動視圖控制器?
- 18. 如何在extjs中調用控制器視圖mvc 4
- 19. 如何管理視圖控制器中的UI表視圖
- 20. 你如何強制視圖控制器調用preferredFocusView?
- 21. 如何在轉到另一個視圖控制器時停止後臺調用?
- 22. UINavigationController popToRootViewController,然後立即推新視圖
- 23. 視圖控制器調用awakeFromNib兩次
- 24. 從視圖Yii控制器調用?
- 25. 使用視圖控制器管理兩個其他視圖控制器
- 26. 如何從第二個視圖控制器調用根視圖控制器中存在的方法?
- 27. 調用視圖控制器類而不彈出視圖控制器本身
- 28. 在調用GetSystemMenu()後清理()
- 29. 如何從模態視圖中popToRootViewController?
- 30. 容器視圖視圖控制器中的UIViewController調用函數
如果您繼承UINavigationController,那麼您可以在調用方法之前或之後攔截對popToRootViewController的所有調用。值得記住的是,popToRootViewController返回一個NSArray *,其中包含從堆棧中彈出的所有viewController,因此您可以將清理消息發送給它們。請參閱下面的答案。 –