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

phi*_*son 4 xib ios

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

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

这方面的任何参考或代码片段都会有所帮助..谢谢!

tit*_*coy 7

要在没有笔尖的情况下创建根导航控制器:

在您的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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

navigationControllerApp Delegate的头文件中的@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;
}
Run Code Online (Sandbox Code Playgroud)

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

你可能不需要这样做(我不推荐它),但是因为你(有点)问...

删除MainWindow.xib.

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

int retVal = UIApplicationMain(argc, argv, nil, @"TestProjectAppDelegate");
Run Code Online (Sandbox Code Playgroud)

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

<key>NSMainNibFile</key>
<string>MainWindow</string>
Run Code Online (Sandbox Code Playgroud)

windowApp Delegate的头文件中的@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...
}
Run Code Online (Sandbox Code Playgroud)