【问题标题】:Switching Content Views Issue切换内容视图问题
【发布时间】:2010-10-26 09:59:39
【问题描述】:

我正在尝试使用 iPhone 应用程序切换视图 - 我有一个父视图控制器 SuperviewController,然后是我想要在该父视图中切换的两个视图 MainMenuControllerMainGameController

*编辑*:我现在正在使用导航控制器:

SuperviewController.m

viewDidLoad
self.mainMenuController = [[MainMenuController alloc] initWithNibName:@"MainMenu" bundle:nil];
[[self navigationController] pushViewController:self.mainMenuController animated:NO];
switchToMainGame
self.mainGameController = [[MainGameController alloc] initWithNibName:@"MainGame" bundle:nil];
[[self navigationController] pushViewController:self.mainGameController animated:NO];

应用正确加载 mainMenu.xib。然而,当调用 switchToMainGame 时,什么也没有发生——就好像 XCode 忘记了 mainGameController 是什么。

感谢您的帮助。

【问题讨论】:

  • SuperviewController中mainMenuController和mainGameController是如何声明的?在 switchToMainGame 中,检查它们是否不为零并尝试打印它们的一些属性以确保对象引用仍然有效。

标签: iphone


【解决方案1】:

您可以考虑使用 UINavigationController 交换视图控制器而不是视图。

在您的 AppDelegate.h 中

@interface AppDelegate : NSObject <UIApplicationDelegate> 
{
    UIWindow *window;
    UINavigationController *navigationController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *navigationController;

@end

并在 -[AppDelegate applicationDidFinishLaunching:] 中实例化 navigationController,因此:

[self setNavigationController:[[UINavigationController alloc] initWithRootViewController:mySuperviewController]];

[[self navigationController] setNavigationBarHidden:YES];   

//  Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];

然后你可以在 SuperviewController.m 中实例化你的 MainMenuController 和 MainGameController,就像你已经做的那样。要从 MainMenuController 开始,您可以在 SuperviewController -viewDidLoad

中执行此操作
[[self navigationController] pushViewController:[self mainMenuController] animated:YES];

您需要添加一些智能来直接在 mainMenuController 和 mainGameController 之间切换 - 但这并不难。

为了避免一次又一次地重新加载 nib,请考虑定义如下访问器方法:

- (MainGameController*) mainGameController
{
if (mainGameController == nil)
    {
    mainGameController = [[MainGameController alloc] initWithNibName:@"MainGame" bundle:nil];
    }
return mainGameController;
}

另外,请记住,在同级视图控制器之间切换涉及弹出当前视图控制器(例如 mainMenuController)推送其他视图控制器(例如 mainGameController)之前。

【讨论】:

  • 这不是我在做的——交换 mainMenuController 和 mainGameController?
  • 您的第二个代码 sn-p 使您看起来像是在使用 -removeFromSuperview 和 -insertSubview 交换 UIView。我建议你使用 -pushViewController:animated: 和 -popViewControllerAnimated:
  • 虽然它不是 UINavigationController 应用程序... SuperviewController 只是一个 UIViewController,所以我认为我做不到。
  • 我不相信我的建议是最好的或正确的方法。但是,将 UINavigationController 添加到您的应用程序并不难。我已经编辑了答案以显示一些代码。
  • 没有。 UIViewController 有一个只读的“navigationController”属性,因此 SuperviewController(我假设它是 UIViewController 的子类)将具有该属性。您将在 AppDelegate.m 代码中实例化 UINavigationController,如上所述进行初始化,从而将其与您的 SuperviewController 相关联。此时 UINavigationController 可以通过您的 SuperviewController 和您推送到导航堆栈的其他 UIViewController 访问。一开始觉得很奇怪,习惯了就很好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2011-07-13
相关资源
最近更新 更多