iOS 7 – 呈现模态视图控制器时获取警告消息

使用iOS 7编译和运行 – 呈现模态视图控制器时出现警告消息:“在分离的视图控制器上呈现视图控制器不鼓励”。 我从来没有与iOS 6或更早版本的问题。 任何人都可以显示,如果有任何改变,而呈现模态视图控制器?

SearchViewController *controller1; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController-iPad" bundle:nil]; } else { controller1 = [[SearchViewController alloc] initWithNibName:@"SearchViewController" bundle:nil]; } controller1.delegate = self; [[self navigationController] presentModalViewController:controller1 animated:YES]; 

* 编辑*这是代码有人可以指出它在哪里嵌套。 看起来他们是嵌套的,请build议如何使用子视图控制器模式链接。

 (void)applicationDidFinishLaunching:(UIApplication *)application { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { self.loginRootviewController = [[MainViewController alloc] initWithNibName:@"MainViewController-iPad" bundle:nil]; } else { self.loginRootviewController = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil]; } UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.loginRootviewController]; DDMenuController *rootController = [[DDMenuController alloc] initWithRootViewController:navController]; _menuController = rootController; AppMainMenuViewController *leftController = [[AppMainMenuViewController alloc] init]; rootController.leftViewController = leftController; self.loginRootviewController.delegateLogin = leftController; self.window.rootViewController = rootController; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; } 

如果故事板没有意识到任何将视图控制器连接到根视图控制器的连接,则视图控制器被分离。

build议您通过Interface Builder创build一个Segue,并在代码中调用它,即使是模态视图,如果使用的是故事板。

即使使用XCode 4.6.x和iOS 6.x,您在构build时也会收到有关未连接的视图控制器的警告。

如果您有两个故事板(一个用于iPhone,另一个用于iPad),则可以将每个Segue命名为相同。 Segue标识符每个故事板只能是唯一的。 因此,使用相同的标识符执行segue( performSegueWithIdentifier )可以将您带到iPhone上的一个位置,以及在iPad上的另一个位置。

我有同样的问题,我也是我没有使用故事板(我正在一个三年的项目)。

在我的情况下,原因是我没有将我的应用程序的rootViewController分配给窗口,如下所示:

 - (BOOL)application:didFinishLaunchingWithOptions: { ... self.window.rootViewController = myRootViewController; // I was missing this ... } 

现在没有更多的警告。

当我们尝试在其他视图控制器中以模态方式呈现视图控制器(这不是rootViewController的一部分)时,通常会出现此警告,我们只需添加子视图视图控制器的视图。

在这个阶段,我们应该在作为rootViewController的一部分的视图控制器中调用presentViewController。

所以我们可以在rootViewController中直接展示任何视图控制器

 UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; [vc presentViewController:obj animated:YES completion:nil]; [vc dismissViewControllerAnimated:YES completion:nil]; 

对于那些使用DDMenuViewController,这是一个简单的修复。 只需添加[self addChildViewController:controller]; initWithRootViewController ,并setRightViewControllersetLeftViewController

为了避免在推送导航中收到警告,您可以直接使用:

 [self.view.window.rootViewController presentViewController:viewController animated:YES completion:nil]; 

然后在你的模式视图控制器中,当一切都完成后,你可以调用:

[self dismissViewControllerAnimated:YES completion:nil];

当你有嵌套的viewcontrollers时,这个消息仍然可能会出现。 如果是这种情况,请确保它们使用子视图控制器模式进行链接。

如果您正在使用故事板并发生此错误,则可能会在尝试自动从viewDidLoad提供视图时发生。 如果你在短时间内调用你的模态继续,那么它没有任何警告。

调用[self presentViewController:vc animated:NO completion:nil]; 在viewDidAppear解决了我的问题。

我有同样的问题。 而不是我如何开始观点,而是如何configuration视图。 我不小心将视图上的类设置为视图控制器类而不是文件所有者。 线索是,它显示的意见,但一些样式失踪。 奇怪的是,它是在旧版本的iOS上工作。

我发现,如果您使用的是故事板,则需要将呈现新视图控制器的代码放在viewDidAppear中。 它也将摆脱“不平衡的呼叫开始/结束外观转换…”警告。

在iOS 7下,presentModalViewController已被弃用。

我用它取代了

[self.navigationController pushViewController:查看animation:是];

并修复了我得到的一些错误。

值得一试。