1. 程式人生 > >macOS 開發 - App Delegate 與storyboard、xib

macOS 開發 - App Delegate 與storyboard、xib


零、引言

今天一個群友問,為什麼刪掉 storyboard 應用就啟動不了,就稍對這個研究了下。
一般建立macOS 程式時,可以選擇勾選/不勾選 storyboard。(xcode 9.3)
如果不勾選 storyboard 就會預設建立一個 xib。

這裡寫圖片描述


把 storyboard 或者 xib 刪掉,app 都無法正常啟動,無法走 AppDelegate 檔案中的 applicationDidFinishLaunching 方法。


事實也說明,這兩個檔案中都包含 AppDelegate 的資訊。
如果不通過 storyboard 和 xib 指定 AppDelegate 呢?這個我還沒找到答案。
下面說說找到的一些細節,也許用得上。


一、storyboard 中的 appDelegate

1、去掉 App Delegate

1、選中 main.storyboard,可以看到右側面板顯示了詳細資訊。
2、右鍵選中 Application,可以看到 delegate 資訊。
3、刪除 delegate 連線的 App Delegate。並再次執行 App,會發現,不走 AppDelegate 檔案中的 applicationDidFinishLaunching 方法。

這裡寫圖片描述


2、連線 App Delegate

1、選中 Application,可以看到最右方顯示連線資訊的面板;
2、將 delegate 選中,並拖拽到 左側的 App Delegate;
3、再次執行 App, 這時又可以正常走 AppDelegate 檔案中的 applicationDidFinishLaunching

方法。

這裡寫圖片描述


二、xib 中的 appDelegate

建立App 時,不勾選 storyboard ,會預設建立一個xib。

1、按照上述方式,檢視xib 中的 Application 物件。會發現delegate 中並沒有對應的連線。

這裡寫圖片描述


2、選中 File’s Owner,在右側面板中,可以看到 delegate 的連線;連線的是左側的delate。
猜想這裡便是 設定 App delegate 的地方。連線和取消連線,都會影響 appDelegate 的設定。

這裡寫圖片描述


三、設定 appDelegate 為其他檔案

1、探索 delegate 的類。

tableView 的delegate 可以是一個 viewcontroller,也可以是一個view,甚至是一個 object。
那麼 appDelegate 也應差不多如此。

在上例 xib 的基礎上,選中delegate 連線的那個物件(objects 下面那個檔案),可以返現,他是一個 AppDelegate 型別物件。
那麼我們可以修改一下他所屬的類試試。

這裡寫圖片描述


2、建立類,實現 NSApplicationDelegate 及方法

這裡建立了一個類繼承自 NSWindowController,並實現 NSApplicationDelegate 及方法applicationDidFinishLaunching

這裡寫圖片描述


3、設定 delegate 為 NSWindowController

修改objects 那個檔案的類為剛才建立的 NSWindowController。

這裡寫圖片描述


然後會發現 objects 下那個物件,變成了 window controller。
再次執行app,將會走NSWindowController 中的 applicationDidFinishLaunching 方法。

這裡寫圖片描述


四、Deployment Info 中的 main interface

我們可以建立多個 windowcontroller、viewcontroller、view 來測試 delegate。
會發現,main interface 中只能勾選,建立時同時有 xib 的。
而每一個 xib 中,都有 application 物件。

這裡寫圖片描述


如果設定 main interface 為空,執行則會報錯

Failed to connect (window) outlet from (NSApplication) to (NSWindow): missing setter or instance variable