2012-07-31 27 views
6

tôi muốn trình bày một modalviewcontroller sau mỗi lần đẩy thông điệp recieves ứng dụng trong "ứng dụng: (UIApplication *) ứng dụng didReceiveRemoteNotification: (NSDictionary *) UserInfo"hiện nhiều hơn một modalview trong appdelegate

tôi trình bày các viewController như điều này:

ReleaseViewController *viewController = [[ReleaseViewController alloc] init]; 
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
[self.window.rootViewController presentModalViewController:navController animated:YES]; 

Vì vậy, khi một tin nhắn push khác đến và ModalViewController cũ vẫn còn hiển thị, tôi muốn trình bày một modalviewcontroller mới hơn cũ. Nhưng nó không hoạt động. Không có gì xảy ra và bảng điều khiển chỉ nói (Tôi nghĩ đó là thông báo gỡ lỗi của iOS 6 Beta):

Warning: Attempt to present <UINavigationController: 0x1dde6c30> on <UINavigationController: 0x1dd73c00> whose view is not in the window hierarchy! 

Tôi làm gì sai?

PS: Tôi không muốn loại bỏ ViewController cũ, tôi muốn chúng ngăn xếp.

Cảm ơn!

Trả lời

11

Bạn có thể lấy đầu của bộ điều khiển tầm nhìn của bạn, sau đó trình bày một phương thức mới từ đó điều khiển nhìn từ trên xuống

- (UIViewController *)topViewController:(UIViewController *)rootViewController 
{ 
    if (rootViewController.presentedViewController == nil) { 
     return rootViewController; 
    } 

    if ([rootViewController.presentedViewController isMemberOfClass:[UINavigationController class]]) { 
     UINavigationController *navigationController = (UINavigationController *)rootViewController.presentedViewController; 
     UIViewController *lastViewController = [[navigationController viewControllers] lastObject]; 
     return [self topViewController:lastViewController]; 
    } 

    UIViewController *presentedViewController = (UIViewController *)rootViewController.presentedViewController; 
    return [self topViewController:presentedViewController]; 
} 

Bạn có thể gọi phương pháp này với rootViewController là cửa sổ của rootViewController

+0

hoạt động hoàn hảo! cảm ơn rất nhiều! :) – CrEaK

+0

Giải pháp tuyệt vời, cảm ơn. – NSTJ

0

Đây là tương tự như trên , nhưng được viết bằng Swift

private func topViewController() -> UIViewController { 
    var rootViewController = UIApplication.sharedApplication().keyWindow!.rootViewController! 
    repeat { 
     if rootViewController.presentingViewController == nil { 
      return rootViewController 
     } 
     if let navigationController = rootViewController.presentedViewController as? UINavigationController { 
      rootViewController = navigationController.viewControllers.last! 
     } 
     rootViewController = rootViewController.presentedViewController! 
    } while true 
} 
0

Đầy đủ Decent đã đóng, nhưng có một vài sai lầm khiến bạn trả lại trình điều khiển chế độ xem sai trong một số các trường hợp. Đây là phiên bản đã sửa.

private func topViewController(rootViewController: UIViewController) -> UIViewController { 
    var rootViewController = UIApplication.sharedApplication().keyWindow!.rootViewController! 
    repeat { 
     guard let presentedViewController = rootViewController.presentedViewController else { 
      return rootViewController 
     } 

     if let navigationController = rootViewController.presentedViewController as? UINavigationController { 
      rootViewController = navigationController.topViewController ?? navigationController 

     } else { 
      rootViewController = presentedViewController 
     } 
    } while true 
} 
Các vấn đề liên quan