Trả lời

5

Đây là câu trả lời.

Đoạn mã sau sẽ bật bộ điều khiển chế độ xem hiện tại.

UINavigationController *navController = self.navigationController; 
// retain ourselves so that the controller will still exist once it's popped off 
[[self retain] autorelease]; 
[navController popViewControllerAnimated:NO]; 

Và đây đẩy mới:

ViewControllerC *viewC = [[ViewControllerC alloc] init]; 
[navController pushViewController:viewC animated:TRUE]; 

Hy vọng nó sẽ giúp!

+2

Bất kỳ ý tưởng làm thế nào để làm điều này với ARC kích hoạt? Trình biên dịch không cho phép sử dụng 'retain' – asdasd

+1

@Oscar, xem giải pháp của tôi, [dưới đây] (http://stackoverflow.com/a/17328244/1431728). – JohnK

0

Tôi nghĩ bạn có thể làm điều này bằng cách popping B đầu tiên từ ngăn điều hướng và sau đó đẩy C vào đó. Bạn sẽ có thể sử dụng [UINavigationController popViewControllerAnimated] và [UINavigationController pushViewController: animated] cho việc này.

+0

Điều này đúng nhưng không đầy đủ. Cuối cùng tôi đã làm nó hoạt động nhưng tôi phải giữ lại bộ điều khiển trước khi bật nó, vì vậy tôi có thể đẩy cái nhìn khác sau đó. UINavigationController * navController = self.navigationController; [[tự giữ lại] autorelease]; [navController popViewControllerAnimated: NO]; – Tony

+0

Theo tham khảo của Apple, http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html UINavigationController không có ý định được phân lớp. Tại sao một cái gì đó rất đơn giản như vậy là phức tạp? – Tony

+0

@Tony Tệ của tôi, tôi đã quên mất điều đó. Bỏ qua nhận xét và chỉnh sửa trước đó của tôi. Tôi sẽ loại bỏ tất cả ... – barley

4

Để tháo cuối cùng thứ hai từ mục navigation:

NSMutableArray *navigationStack = [[NSMutableArray alloc] initWithArray: 
    self.navigationController.viewControllers]; 
[navigationStack removeObjectAtIndex:[navigationStack count] - 2]; 
self.navigationController.viewControllers = navigationStack; 

Ví dụ, chạy này từ viewDidLoad trên bộ điều khiển C để loại bỏ điều khiển B từ thanh điều hướng stack.

23

Trong bối cảnh của ARC, đây là một giải pháp khả thi:

NSMutableArray* navArray = [[NSMutableArray alloc] initWithArray:self.navigationController.viewControllers]; 
[navArray replaceObjectAtIndex:[navArray count]-1 withObject:nextViewController]; 
[self.navigationController setViewControllers:navArray animated:YES]; 

Như bạn có thể nói, mã này thay cho mã đẩy thông thường trong giao diện bạn đang cố gắng để loại bỏ từ ngăn xếp ("B" trong câu hỏi của bạn). Dòng 1 sao chép danh sách các bộ điều khiển chế độ xem từ ngăn điều hướng nav vào một số NSMutableArray. Dòng 2 thay thế chế độ xem cuối cùng (trên cùng) bằng chế độ xem mà chúng tôi muốn chuyển sang tiếp theo ("C"). Dòng 3 làm cho ngăn xếp của bộ điều hướng thực tế trở thành mảng được thay đổi của chúng ta và làm cho quá trình chuyển đổi trở thành mục trên cùng. (Tất nhiên bạn không thể sử dụng mã này trong viewController root.)

Tôi tìm thấy một cách khác here và áp dụng nó cho ARC:

UINavigationController *navController = self.navigationController; 
[navController popViewControllerAnimated:NO]; 
[navController pushViewController:someViewController animated:YES]; 

Dòng đầu tiên là cần thiết bởi vì một khi bạn đã popped chế độ xem hiện tại tắt ngăn xếp, self.navigationController sẽ là nil và dòng thứ ba sẽ không hoạt động. Cùng một số dòng như cách trước đó, nhưng cách này hoạt động thông qua các phương thức dựng sẵn thay vì "không hợp lệ" bằng cách sử dụng chồng.

+0

Cảm ơn triển khai thứ hai của bạn chính xác là những gì tôi đang tìm kiếm. – NMunro

+0

cảm ơn, giải thích là tuyệt vời! – Michael

-2

Bạn có thể sử dụng mã này.

NSMutableArray * navigationArray = [[NSMutableArray alloc] initWithArray: self.navigationController.viewControllers]; [navigationArray removeAllObjects]; self.navigationController.viewControllers = navigationArray;

Hy vọng điều đó sẽ phù hợp với bạn.

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