来自另一个视图控制器时的 xcode 问题

Posted

技术标签:

【中文标题】来自另一个视图控制器时的 xcode 问题【英文标题】:xcode issues when coming from another view controller 【发布时间】:2014-03-01 20:25:45 【问题描述】:

我正在开发一个 iPhone 应用程序并遇到了一些问题。我有一个主视图控制器和另一个名为 GameViewController 的控制器。我在主视图控制器中有一个按钮可以进入游戏,游戏中有一个后退按钮可以返回主视图控制器。如果我转到游戏视图控制器并返回主视图,下次按下按钮转到游戏视图控制器时,我会发现各种故障。这是我的按钮去 gameViewController 的代码:

   GameViewController *game = [[GameViewController alloc] initWithNibName:nil bundle:Nil];
    [self dismissViewControllerAnimated:YES completion:NULL];

[self presentViewController:game animated:YES completion:NULL];

这是转到主视图控制器的后退按钮代码:

    ViewController *home = [[ViewController alloc] initWithNibName:nil bundle:nil];
UIViewController *parentViewController = self.presentingViewController;
[self dismissViewControllerAnimated:YES completion:^
 
     [parentViewController presentViewController:home animated:NO completion:nil];
 ];

如果有人能提供帮助,将不胜感激。

【问题讨论】:

【参考方案1】:

你有什么理由不使用UINavigationController?即使您想隐藏导航栏并提供自己的导航 UI,也可以使用它。听起来您有自己的后退按钮,这就足够了。

使用 UINavigationController,您的代码看起来更像这样:

// in your application delegate's application:didFinishLaunchingWithOptions: method

UINavigationController *nav = [UINavigationController alloc] initWithRootViewController:home];
nav.navigationBarHidden = YES; // this hides the nav bar
self.window.rootViewController = nav;

// from your 'home' VC to present the game vc:

GameViewController *game = [[GameViewController alloc] initWithNibName:nil bundle:Nil];
[self.navigationController pushViewController:game animated:YES];

// from your 'game' VC to get back to 'home':

[self.navigationController popViewControllerAnimated:YES];

您只是在一个地方实例化“家庭”和“游戏”视图控制器,而 UINavigationController 将视图控制器显示在其堆栈的顶部。

【讨论】:

最好使用initWithRootViewController:,你有navigationControllers = 我猜你的意思是viewControllers = @Wain 谢谢!我在考虑 UITabBarController ,其中更常见的是传递一组视图控制器。我更新了我的示例。【参考方案2】:

您的“返回”代码并没有真正返回,而是返回然后呈现主视图控制器的新副本。

然后,您的“游戏”代码将被解除,这将删除当前控制器(因为您在返回时呈现了它),然后从中呈现游戏。

这很混乱,因为您将展示其展示控制器已被销毁的控制器。最好使用导航控制器。但是,如果您只是像这样呈现和关闭,则可以更正当前代码:

首页 -> 游戏:

GameViewController *game = [[GameViewController alloc] initWithNibName:nil bundle:Nil];
[self presentViewController:game animated:YES completion:NULL];

游戏 -> 主页

[self dismissViewControllerAnimated:YES completion:NULL];

【讨论】:

但我想重新加载视图。我怎么能做到这一点? 视图控制器应该接收viewWillAppear:viewDidAppear:方法回调,这样你就可以在那里更新你的UI。【参考方案3】:

您应该寻找 Segues 代替!您无法关闭源视图控制器。

【讨论】:

以上是关于来自另一个视图控制器时的 xcode 问题的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式调用storyboard视图控制器时的Xcode断言

从 Tab View Controller 切换到滑动手势时的 iOS Xcode 问题

导航控制器 - 如何在 Xcode 中添加另一个视图控制器?

iOS Xcode - 编辑情节提要对象导致视图控制器场景复制另一个场景然后 Xcode 崩溃

应用程序启动结束时的根视图控制器,默认为 cocos2d 视图控制器而不是另一个故事板视图

显示键盘时推送另一个视图时的tableView调整大小问题