专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构
使用纯代码来加载iPhone和iPad界面
- 到目前为止,我们是通过
Main.storyboard
来布局界面的,在很多时候我们会通过纯代码的方式来布局.将现在的storyboard
布局方式改成纯代码
- 定义
CZTabBarController
继承UITabBarController
用于显示iPhone
界面 - 删除项目配置中
Main Interface
的配置 在
AppDelegate
的application:didFinishLaunchingWithOptions:
方法中创建window
并设置根控制器/// 程序启动完成 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1.创建 window self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // 2.设置背景色 self.window.backgroundColor = [UIColor whiteColor]; // 3.判断运行的设备 if (isIPhone) { // 运行的设备是 iPhone,设置iPhone主界面 self.window.rootViewController = [[CZTabBarController alloc] init]; } else { self.window.rootViewController = [[CZSplitViewController alloc] init]; } // 4.让window称为主窗口并显示 [self.window makeKeyAndVisible]; return YES; }
- 运行在
iPhone
上正常.但是运行在iPad
上崩溃了,原因如下:Splitview controller <CZSplitViewController: 0x7fad3b816800> is expected to have a view controller at index 0 before it's used! *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArray0 objectAtIndex:]: index 0 beyond bounds for empty NSArray'
- 提示
SplitviewCcontroller
在使用时index 0(master控制器)
必须有值 修改
iPad
设备下设置rootViewController
// 3.判断运行的设备 if (isIPhone) { // 运行的设备是 iPhone,设置iPhone主界面 self.window.rootViewController = [[CZTabBarController alloc] init]; } else { // 创建 CZSplitViewController CZSplitViewController *spVC = [[CZSplitViewController alloc] init]; // CZSplitViewController添加master控制器 [spVC addChildViewController:[[CZMenuViewController alloc] init]]; self.window.rootViewController = spVC; }
发现
AppDelegate
需要关心UISplitViewController
的master
控制器的设置,根据面向对象的原则谁的事情谁负责
, 将设置master
控制器的步骤封装到CZSplitViewController
里面去在
CZSplitViewController.m
中实现init
方法- (instancetype)init { if (self = [super init]) { // CZSplitViewController添加master控制器 [self addChildViewController:[[CZMenuViewController alloc] init]]; } return self; }
在
AppDelegate
中调用/// 程序启动完成 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // 1.创建 window self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // 2.设置背景色 self.window.backgroundColor = [UIColor whiteColor]; // 3.判断运行的设备 if (isIPhone) { // 运行的设备是 iPhone,设置iPhone主界面 self.window.rootViewController = [[CZTabBarController alloc] init]; } else { // 运行的设备是 iPad,设置iPad主界面 self.window.rootViewController = [[CZSplitViewController alloc] init]; } // 4.让window称为主窗口并显示 [self.window makeKeyAndVisible]; return YES; }