专业java、php、iOS、C++、网页设计、平面设计、网络营销、游戏开发、前端与移动开发培训机构

使用纯代码来加载iPhone和iPad界面

  • 到目前为止,我们是通过 Main.storyboard 来布局界面的,在很多时候我们会通过纯代码的方式来布局.将现在的 storyboard 布局方式改成 纯代码
  • 定义 CZTabBarController 继承 UITabBarController 用于显示 iPhone 界面
  • 删除项目配置中 Main Interface 的配置
  • AppDelegateapplication: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 需要关心 UISplitViewControllermaster 控制器的设置,根据面向对象的原则 谁的事情谁负责, 将设置 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;
        }