Swift - 不用 Storyboard 來啟動 App

  • 0
    いいね
  • 0
    コメント
    この記事は最終更新日から1年以上が経過しています。

    最近開始做自己的小專案,試著用純 Swift 來寫,第一步就是想要把跟不太喜歡在開發時又有點吃資源的 Storyboard 移掉 XD

    我其實是 UI 手刻控、也都不用 Interface Builder。最近也認真的開始使用 xib 搭配 autolayout 使用(其實有可能是數學算太久了有點累 XD),配置的方式也比較物件導向,因此我也優先選擇這個方式做;這樣的話,也不會用到 Xcode 預設配置的 Main Storyboard。

    初步清場

    首先,在專案設定頁中,選中一個 Target ,在 General 頁籤下 Deployment Info 區塊中的 Main Interface 中的文字清除,就可以避免專案開啟時,去讀取 Main Storyboard。


    來到 AppDelefate.swift 中,去除一些其他不需要的 application delegate methods ,只留下開啟時會呼叫的 application:didFinishLaunchingWithOptions:,剩下這樣:

    AppDelefate.swift
    import UIKit
    
    @UIApplicationMain
    class AppDelegate: UIResponder, UIApplicationDelegate {
    
        var window: UIWindow?
    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
            return true
        }
    }
    

    顯示畫面

    UIWindow

    預設就有配置一個 optional variable window ,他就是用來顯示 app 所有畫面的視窗。這個類別類似於桌面程式中「視窗」,只不過差別在 Mac app 中的 NSWindow 可以有不只一個 instances 在切換;在 iOS 中沒有切換視窗的概念,則只需要一個 instance 作為根視窗。

    初始化

    首先,這個 window 並還沒有被初始化,我們將它初始化,並將 frame 設定為主要螢幕的大小

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
        // 初始化 self.window
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    
        return true
    }
    

    顯示出來

    這個 window 不會憑空就顯示在畫面上,我們則需要透過 makeKeyAndVisible 這個 method 讓它顯示出來。為了可以清楚知道真的有顯示,在這邊先把他的背景色改成白色。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        // 把 window 的背景改成白色
        self.window?.backgroundColor = UIColor.whiteColor()
    
        // 把 window 顯示出來
        self.window?.makeKeyAndVisible()
    
        return true
    }
    

    由於 window property 是一個 optional variable ,使用它的時候則需要幫他解開束縛、在後面加上 ! 來 unwrapping 這個值

    加入 Root View Controller

    UIWindow 有一個屬性是用來顯示根 view controller - rootViewController ,只要將需要第一個顯示的 view controller 丟給她,在 app 開啟時,就會幫我們在顯示 launch image 之後第一個顯示出來。

    為了清楚知道有顯示 view controller 出來,在這裡先指定背景為灰色來清楚識別。

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        self.window?.backgroundColor = UIColor.whiteColor()
    
        // 宣告一個 view controller 並指定背景為灰色
        let viewController = UIViewController()
        viewController.view.backgroundColor = UIColor.grayColor()
    
        // 指定 root view controller
        self.window?.rootViewController = viewController
    
        self.window?.makeKeyAndVisible()
    
        return true
    }
    

    完成

    到這裡即告一個段落,接著只要根據需求,根據這個方式,把主要的 view controller (如 tab bar controller) 替換上去即可。

    同步發佈




    本文範例以 Xcode Version 6.3 (6D570), iOS SDK 8.3 建置。如果發現相關內容有更新,麻煩請在下方留言告知,謝謝。