2014-09-22 52 views
1

我有一種方法,呈現控制器並使呈現控制器成爲根控制器。它在Xcode 5中工作正常,但在Xcode 6中它崩潰。我需要出示視圖控制器,使之根,沒有任何查看錯誤......舊的代碼崩潰,新的有錯誤,同時也使根控制器呈現控制器並使其成爲根控制器

原代碼

-(void)presentViewController:(UIViewController *)controller withCompletion:(void(^)(void))completion 
{ 
    UIViewController *currentController; 
    currentController = [self controller]; 
    [currentController presentViewController:controller animated:true completion:^{ 
     [controller dismissViewControllerAnimated:false completion:NULL]; 
     if(completion){ 
      completion(); 
     } 
    }]; 
} 

試圖與延遲來改變它像

-(void)presentViewController:(UIViewController *)controller withCompletion:(void(^)(void))completion 
{ 
    UIViewController *currentController; 
    currentController = [self controller]; 
    [currentController presentViewController:controller animated:true completion:^{ 
     //use delay before execution 
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
      [controller dismissViewControllerAnimated:false completion:NULL]; 
      if(completion){ 
       completion(); 
      } 

     }); 
    }]; 
} 

但是,我有視圖閃爍與以前的看法。也試圖使不在一個區塊

-(void)presentViewController:(UIViewController *)controller withCompletion:(void(^)(void))completion 
{ 
    UIViewController *currentController; 
    currentController = [self controller]; 
    [currentController presentViewController:controller animated:true completion:NULL]; 
    [controller dismissViewControllerAnimated:false completion:NULL]; 
    if(completion){ 
     completion(); 
    } 
} 

但這種方式我堅持以前的看法。

+0

您是否嘗試過推視圖控制器? – twodayslate 2014-09-22 09:39:05

+0

它在哪一行崩潰,錯誤消息是什麼? – geo 2014-09-22 09:41:48

+0

如果沒有延遲(dispatch_after(...))它崩潰 – mrDeadLinez 2014-09-23 09:45:36

回答

0

首先,你需要從Window對象獲得主導航控制器:

UIWindow *keyWindow = [[[UIApplication sharedApplication] delegate] window]; 
UINavigationController *rootNavController = (UINavigationController *)keyWindow.rootViewController; 

,並設置新的根視圖 - 控制

UIViewController *rootViewController = [[UIViewController alloc] init]; 
[rootNavController setViewControllers:@[rootViewController] animated:NO]; 
[rootNavController pushViewController:rootViewController animated:YES completion:^{ 
    NSLog(@"rootViewController shown"); 
}]; 
+0

它可以不是一個UINavigationController,它可以通過簡單的UIViewController,所以這種方式並不好。並提出它莫代爾,而不是推動。 – mrDeadLinez 2014-09-23 09:49:42

+0

要以root身份創建UIViewController,您需要將其設置在當前的UINavigationController中。完成後,您可以展示您的控制器。 – fdlr 2014-09-23 10:20:04

+0

閱讀我以前的評論:根控制器可能不是一個導航控制器,例如,如果我使用滑動菜單,它有內部導航控制器,但它仍然不會使其根控制器 [rootNavController setViewControllers:@ [rootViewController] animated:沒有]; 可能會導致崩潰! – mrDeadLinez 2014-09-24 10:58:49