iOS
Swift

Swift - 不用 Storyboard 來啟動 App

More than 1 year has passed since last update.

最近開始做自己的小專案,試著用純 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 建置。如果發現相關內容有更新,麻煩請在下方留言告知,謝謝。