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

时间:2011-05-25 03:37:44

标签: ios xib

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

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

对此的任何参考或代码片段都会有所帮助.. 谢谢!

1 个答案:

答案 0 :(得分: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;
}

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

打开MainWindow.xib并断开App Delegate的navigationController属性,然后删除Objects面板中的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...
}