iOS - 通过代码加载导航控制器

Posted

技术标签:

【中文标题】iOS - 通过代码加载导航控制器【英文标题】:iOS - loading navigation controller via code 【发布时间】:2011-05-25 03:37:44 【问题描述】:

我有一个通过项目向导设置的导航控制器。目前,当应用程序启动时,导航控制器会自动创建并显示。

我现在需要通过代码而不是通过 .xib 魔法来控制导航控制器的显示。如何禁用 MainWindow.xib/RootViewController.xib 的自动创建?我承认我实际上并不知道发生了什么以及 MainWindow.xib 和 RootController.xib 之间的关系,因为向导设置了这一切。

对此的任何参考或代码sn-ps都会有所帮助.. 谢谢!

【问题讨论】:

【参考方案1】:

要创建没有 nib 的根导航控制器:

在您的 App Delegate 中,您应该会看到以下内容:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    // Override point for customization after application launch.
    // Add the navigation controller's view to the window and display.

    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;

self.navigationController 指的是从 MainWindow.xib 加载的导航控制器(此文件的名称在您应用的 Info.plist 文件中指定;见下文)。

打开 MainWindow.xib 并断开 App Delegate 的 navigationController 属性,然后删除对象面板中的 Navigation Controller(不是 Window)对象。

从 App Delegate 的头文件中的 navigationController @property 声明中删除 IBOutlet 属性(因为它不再从 nib 文件中连接)。

将您的 App Delegate 中的代码替换为以下行:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    RootViewController *rootViewController = [[[RootViewController alloc] initWithNibName:nil bundle:nil] autorelease];
    self.navigationController = [[[UINavigationController alloc] initWithRootViewController:rootViewController] autorelease];

    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];
    return YES;

要创建没有笔尖的主窗口:

你可能不需要这样做(我也不推荐这样做),但既然你(有点)问...

删除 MainWindow.xib。

在 main.m 中,将 UIApplicationMain 的最后一个参数替换为您的 App Delegate 的名称(没有扩展名)。例如:

int retVal = UIApplicationMain(argc, argv, nil, @"TestProjectAppDelegate");

打开您的 Info.plist 文件并删除以下两行:

<key>NSMainNibFile</key>
<string>MainWindow</string>

从您的 App Delegate 头文件中的 window @property 声明中删除 IBOutlet 属性。

在您的 App Delegate 中创建窗口:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    // The rest stays the same...

【讨论】:

以上是关于iOS - 通过代码加载导航控制器的主要内容,如果未能解决你的问题,请参考以下文章

从 iOS 11 搜索控制器导航时不需要的 UITableView 重新加载动画

iOS小技能:导航控制器(控制器view的多种创建方式控制器的生命周期)

当项目使用自动布局时,导航控制器无法在 iOS 7 中推送视图控制器

加载视图时导航栏跳跃

iOS中的导航栏按钮图像需要15秒才能加载

iOS - 通过在左边缘平移弹出视图控制器,导航栏消失