2012-11-12 45 views
34

Tôi đang cố gắng tạo bộ điều khiển chế độ xem trong ủy nhiệm ứng dụng của mình (tôi đã tạo một hàm có tên là showLoginView). Nhưng bất cứ khi nào tôi cố gắng gọi nó là tôi nhận được một cảnh báo trong XCode:Cố gắng hiển thị * trên * có chế độ xem không nằm trong hệ thống phân cấp cửa sổ

Warning: Attempt to present <PSLoginViewController: 0x1fda2b40> on <PSViewController: 0x1fda0720> whose view is not in the window hierarchy! 

Dưới đây là các phương pháp mã:

- (void)showLoginView 
{ 
    PSLoginViewController *loginViewController = [[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:NULL] instantiateViewControllerWithIdentifier:@"PSLoginViewController"]; 
    [self.window.rootViewController presentViewController:loginViewController animated:NO completion:nil]; 
} 

Làm thế nào tôi có thể thêm quan điểm cho hệ thống cấp bậc cửa sổ? Hoặc có lẽ tôi đang làm điều gì đó rất sai?

Trả lời

29

Bạn không thể hiển thị bộ điều khiển chế độ xem phương thức từ appDelegate. Bạn cần hiển thị một ViewController phương thức từ bất cứ viewController nào hiện đang hiển thị toàn màn hình. Nói cách khác, bạn cần phải đặt mã đó vào bộ điều khiển chế độ xem gốc của bạn hoặc bất kỳ mã nào bạn muốn hiển thị vc phương thức từ ...

Ngoài ra, bạn sẽ muốn sử dụng phương thức "presentModalViewController" để trình bày phương thức. Bạn có thể thiết lập các thuộc tính trên vc phương thức như:

vC.modalPresentationStyle = UIModalPresentationFormSheet; 
vC.modalTransitionStyle = UIModalTransitionStyleCoverVertical; 
[self presentModalViewController:vC animated:YES]; 
+0

nhưng rootViewController không phải là một hiển thị vào lúc này? Làm thế nào tôi nên thực hiện chức năng chung, rằng bất cứ khi nào thông tin đăng nhập người dùng kiểm tra không thành công nó có thể trình bày một bộ điều khiển xem đăng nhập? – patryk

+0

Bạn đang sử dụng bộ điều khiển điều hướng? – HackyStack

+5

Tôi sẽ sử dụng một bộ điều khiển điều hướng và sau đó bạn có thể nhận được một tham chiếu đến một hiển thị như: displayController = [navController topViewController]; Sau đó, bạn có thể đẩy modally như trên, nơi bạn sẽ thay thế tự với displayController. – HackyStack

3

Bạn có thể NSLog (@ "% @", self.window.rootViewController), và xem những gì rootViewController thực sự là.

Tôi đã gặp phải vấn đề này, khi rootViewController là một UIViewController bình thường. Thay thế nó bằng một UINavigationController, muốn nó sẽ giúp.

19

Bạn thực sự có thể trình bày bộ điều khiển chế độ xem từ AppDelegate miễn là bạn phát hiện chế độ xem hiển thị hiện tại và xử lý trường hợp bộ điều khiển hiện tại của bạn là navigationController.

Dưới đây là những gì tôi làm:

UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController; 
if ([activeController isKindOfClass:[UINavigationController class]]) { 
    activeController = [(UINavigationController*) activeController visibleViewController]; 
} 
[activeController presentModalViewController:loginViewController animated:YES]; 
+1

Tuyệt vời! Nó hoạt động! – echo

+1

Ngoài ra bạn có thể trao đổi: '[activeController presentModalViewController: loginViewController hoạt hình: YES]' to '[activeController presentViewController: loginNavigationController hoạt hình: KHÔNG hoàn thành: nil]' nếu bạn muốn trình bày một bộ điều khiển điều hướng. –

+0

Tuyệt vời! Cảm ơn. –

8
UIViewController *activeController = [UIApplication sharedApplication].keyWindow.rootViewController; 
if ([activeController isKindOfClass:[UINavigationController class]]) 
{ 
    activeController = [(UINavigationController*) activeController visibleViewController]; 
} 
else if (activeController.modalViewController) 
{ 
    activeController = activeController.modalViewController; 
} 
[activeController presentModalViewController:vc animated:YES]; 
+0

.modalViewController hiện không còn được dùng nữa, bạn có thể sử dụng ngay bây giờ activeController.presentedViewController – Pach

7

Tôi chạy vào vấn đề này trên iOS 7 - chìa khóa để thực hiện bất kỳ trong những giải pháp làm việc đề xuất là để gọi

[self.window makeKeyAndVisible]; 

trong AppDelegate của bạn. Sau cuộc gọi đó, trình bày chế độ xem phương thức từ cửa sổ rootViewController đã hoạt động.

+0

Tôi không tải bảng phân cảnh theo cách thủ công vì vậy đây là nó. cảm ơn rất nhiều. – glasz

4

Một lý do khác cho cảnh báo đó có thể là bạn muốn trình bày bộ điều khiển xem từ một cá thể không phải là bộ điều khiển xem nhiều nhất.

Vì vậy, đầu tiên bạn phải có được UIViewController trên cùng và sử dụng trường hợp này gọi presentViewController:

UIViewController *root = [UIApplication sharedApplication].keyWindow.rootViewController; 
while (root.presentedViewController) { 
    root = root.presentedViewController; 
} 
+1

Swift 3 UIApplication.shared.keyWindow? .rootViewController? .present (vc, hoạt ảnh: true, completion: nil) – Jason

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