【问题标题】:Black screen when programmatically creating navigation controller以编程方式创建导航控制器时出现黑屏
【发布时间】:2013-06-03 00:30:39
【问题描述】:

我正在以编程方式创建一个导航控制器,如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.mainMenuViewController = [[MainMenuViewController alloc] init];
    self.window.rootViewController = self.mainMenuViewController;
    UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:self.window.rootViewController];
    [self.window makeKeyAndVisible];
    [[GKHelper sharedInstance] authenticateLocalPlayer];
    return YES;
}

而且,虽然 Xcode 似乎对此非常满意,但当我使用此代码启动我的应用程序时却出现黑屏。当我将其注释掉并仅使用情节提要中的箭头时,它可以正常工作,但我没有导航控制器。我做错了什么?

【问题讨论】:

  • 首先:您可以使用故事板添加导航控制器。但那将是一个不同的问题,对吧?
  • 是的。这就是我以前在做的事情。但是因为我正在做一个全定制的 UI,所以完全隐藏它是不可能的。因此,我尝试以编程方式获取它,这样我就可以拥有所有自定义 UI 元素,而无需使用陈词滥调的导航元素。
  • 第二:你确实有一个根视图控制器和一个导航控制器。但是您实际上在哪里添加、布局、着色等您的视图?你是在 MainMenuViewController 中的 loadView 或 viewDidLoad 中执行此操作吗?如果您有视图的 XIB 文件,那么您没有加载它,正如我们在代码片段中看到的那样。如果您想从情节提要中加载单个视图,这是可能的,那么您不要这样做。那么你想做什么才能真正展示你的观点呢?
  • 如您所见,我希望 MainMenuViewController 由根视图控制器控制。我分配并初始化它,然后将它分配给窗口的根视图控制器。不知何故,这似乎不起作用。
  • 好的。但是当你不想看到陈词滥调的 ui 元素时,为什么要使用导航控制器呢?如果您想要自己的自定义导航,那么您可以简单地基于模态演示来做到这一点。导航控制器只是为了帮助您解决开销。但是当您想以不同的方式执行此操作时,使用 UINavigationController 可能不是最佳选择。

标签: ios objective-c uinavigationcontroller


【解决方案1】:

在尝试向其发送消息之前,您需要创建UIWindow 对象。您还需要将导航控制器设置为窗口的rootViewController

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.mainMenuViewController = [[MainMenuViewController alloc] init];
    UINavigationController* navigationController = [[UINavigationController alloc] initWithRootViewController:self.mainMenuViewController];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
    [[GKHelper sharedInstance] authenticateLocalPlayer];
    return YES;
}

更新

我看到您正在尝试从使用故事板过渡。您的MainMenuViewController 需要以某种方式创建或加载其视图。当您使用情节提要时,您的 MainMenuViewController 正在从情节提要中加载其视图。您有三个选择:

  1. 您可以从情节提要中加载MainMenuViewController,以便它从情节提要中加载其视图。在情节提要中,为您的 MainMenuViewController 提供一个标识符。假设您将标识符设置为MainMenu。然后您可以像这样从情节提要中加载MainMenuViewController

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    self.mainMenuViewController = [storyboard instantiateViewControllerWithIdentifier:@"MainMenu"];
    
  2. 您可以创建一个包含MainMenuViewController 视图的.xib 文件。如果您将其命名为 MainMenuViewController.xibMainMenuViewController 将自动使用它(当您没有从情节提要加载视图控制器时)。

  3. 您可以实现-[MainMenuViewController loadView]来创建视图并将其存储在self.view中。

【讨论】:

    【解决方案2】:

    它没有显示任何东西,因为真的没有什么可显示的:)。当您以编程方式执行此操作时,您必须: 1.实例化导航控制器 2. 实例化您想要放入其中的视图控制器。 3. 创建这些对象的数组 4. 将数组添加到导航控制器 5.设置navController为view。

    代码sn-p:

        UINavigationController *navContr = [[UINavigationController alloc]init];
        FirstViewController *firstViewContr = [[FirstViewController alloc] init];
        MapViewController *mapContr = [[MapViewController alloc] init];
        NSArray *vcArray = [NSArray arrayWithObjects: mapContr, firstViewContr, nil];
        [navContr setViewControllers:vcArray];
        [self.window setRootViewController:navContr];
        [self.window makeKeyAndVisible];
        return YES;
    

    【讨论】:

    • 您不需要以这种方式创建东西。 OP 发布的用于创建初始导航控制器的代码是正确的。
    猜你喜欢
    • 1970-01-01
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-11
    • 2011-04-14
    相关资源
    最近更新 更多