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的多种创建方式控制器的生命周期)