7

Tôi có một ứng dụng sử dụng hai UINavigationControllers - một cho hệ thống menu và một cho các trò chơi thực tế. Một UINavigationController phổ biến được khai báo trong appDelegate của tôi. Khi ứng dụng tải, ứng dụng sẽ tải Trình đơn hoặc UINavigationController của Trò chơi. Và tất nhiên người chơi có thể điều hướng giữa hai người.Juggling nhiều UINavigationControllers sử dụng App Delegate và đảm bảo UINavigationController chính xác deallocs

Khi đi từ menu để các trò chơi, tôi tạo ra một UINavigationController mới và tặng nó như sau:

GameViewController *rootController = [[GameViewController alloc] init]; 
    UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:rootController]; 
    [rootController release]; 
    newNavController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
    [self presentModalViewController:newNavController animated:YES]; 
[newNavController release]; 

Tuy nhiên, tôi đã nhận thấy rằng khi tôi làm điều này, viewController của menu không bao giờ gọi dealloc. Có lẽ vì vẫn còn một tham chiếu đến một cái gì đó giữ nó sống. Tôi đã tìm thấy rằng khi tôi thiết lập một cách rõ ràng URIavigationController của App Delegate cho bộ điều khiển điều hướng mới, (trước khi phát hành navController mới) nó sẽ giải phóng Menu. Tôi làm như sau:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController = newNavController; 
[newNavController release]; 

Thực tiễn này có tốt không? Tuy nhiên, tôi đã thấy rằng khi điều hướng từ trò chơi trở lại menu, mẹo tương tự dường như không hoạt động. I E.

MainMenuViewController *menuViewController = [[MainMenuViewController alloc] init]; 
UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:menuViewController]; 
[menuViewController release]; 
newNavController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve; 
[self presentModalViewController:newNavController animated:YES]; 

//Setting the appDelegate's navController to the new navController allows the menu to dealloc. 
//This must happen AFTER the newNavController has been loaded. 
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController = newNavController; 
[newNavController release]; 

không bao giờ gọi dealloc trên ViewController chính của trò chơi. Và khi tôi điều hướng trở lại trò chơi một lần nữa, ViewController chính của trình đơn không còn được phát hành nữa.

Tôi có thiếu thứ gì đó khi tung hứng UINavigationControllers không?

Cảm ơn bạn,

Michael

EDIT: Tôi đã kể từ khi nhận ra rằng lý do ViewController chính trò chơi của tôi đã không được deallocing, là vì tôi có một số NSTimers rằng tôi đã không không còn giá trị! Tuy nhiên, tôi vẫn tò mò muốn biết cách tiếp cận trên của tôi có chính xác hay không và xác định rõ ràng navController trong App Delegate là cách chính xác để cho phép các UINavigationControllers khác nhau dealloc :)

+0

Tôi đang bối rối bởi một vài điều sau: 1) Nếu ứng dụng của bạn là trò chơi, tại sao bạn lại muốn xử lý bộ điều khiển chế độ xem của trò chơi? 2) Như một hệ quả, tại sao bạn trình bày bộ điều khiển trò chơi một cách bình thường? 3) Bộ điều khiển xem bạn đang sử dụng để trình bày bộ điều khiển trò chơi và trình đơn (tức là, lớp 'self' trong mã ví dụ của bạn là gì và vai trò của đối tượng đó trong ứng dụng của bạn)? – jlehr

+0

1. Vâng, đó là một trò chơi khá đơn giản, và người dùng có thể lật qua lại giữa menu và trò chơi, vì vậy tôi nghĩ rằng nó sẽ chỉ là thực hành tốt để dỡ bỏ các trò chơi khi họ vào menu. 2. Tôi không chắc chắn làm thế nào để trình bày bộ điều khiển trò chơi để làm cho nó lật xung quanh độc đáo. Tôi có thể thêm nó như là một subview của cửa sổ, nhưng sau đó nó chỉ thay đổi đột ngột và tôi thích quá trình chuyển đổi. Đây có phải là hành động xấu không? 3) Bản thân trong mã của tôi là rootViewController của UINavigationController hiện tại. Điều đó có tệ không: o – Smikey

Trả lời

8

Làm cho cuộc sống của bạn dễ dàng hơn. Sử dụng một UINavigationController duy nhất, và duy trì hai ngăn xếp View Controller riêng biệt, mà chỉ là mảng của UIViewControllers. Bạn có thể sử dụng [UINavigationController setViewControllers:animated:] để chỉ trao đổi ngăn xếp và để bộ điều khiển điều hướng tại chỗ. Sử dụng UINavigationController.viewControllers để ngăn xếp hiện tại giữ lại trước khi thay thế. Đó là một cái gì đó giống như 14,3 tỷ lần dễ dàng hơn và sạch hơn so với đối phó với tất cả các vagaries của nhiều nav điều khiển.

+1

Tôi nên chuyển công tắc - trong ứng dụng đại biểu ở đâu? – Smikey

Các vấn đề liên quan