共用方式為


Xamarin.iOS 中的 .xib 程式代碼產生

Apple Interface Builder 工具 (“IB”) 可用來以可視化方式設計使用者介面。 IB 建立的介面定義會儲存在 .xib 檔案中。 .xib 檔案中的 Widget 和其他物件可能會獲得「類別識別」,這可以是自定義使用者定義型別。 使用自定義類型可讓您自定義小工具的行為,以及撰寫自定義小工具。

這些用戶類別通常是UI控制器類別的子類別。 它們具有 可以連接到介面對象的輸出 (屬性)和 動作 (事件)。 在運行時間,會載入IB。 此時會建立物件,並動態連線到各種UI對象的輸出和動作。 定義這些 Managed 類別時,您必須定義所有動作和輸出,以符合 IB 預期的動作和輸出。 Visual Studio for Mac 會使用類似 CodeBehind 的模型來簡化程序代碼。 Xcode 有類似的 Objective-C 模型。 但 Xamarin.iOS 程式代碼產生模型和慣例已調整為更熟悉 .NET 開發人員。

.xib 檔案和自定義類別

除了使用 Cocoa Touch 的現有類型之外,還可以在 .xib 檔案中定義自定義類型。 您也可以使用在其他 .xib 檔案中定義的類型,或純粹在 C# 程式代碼中定義。 目前,介面產生器不知道目前 .xib 檔案外定義的類型詳細數據,因此不會列出它們或顯示其自定義輸出和動作。 計劃在未來某個時候移除這項限制。

自定義類別可以使用介面產生器的 [類別] 索引標籤中的 “Add Subclass” 命令,在 .xib 檔案中定義。 我們將這些類別稱為“CodeBehind” 類別。 如果 .xib 檔案在專案中有 “.xib.designer.cs” 對應檔案,則 Visual Studio for Mac 會自動填入 .xib 中所有自定義類別的部分類別定義。 我們將這些部分類別稱為「設計工具類別」。

產生程式碼

針對任何{0}具有Page建置動作的{0} .xib 檔案,程式代碼產生是由.xib.designer.cs檔案所啟用。 Visual Studio for Mac 會在設計工具檔案中針對可在 .xib 檔案中找到的所有使用者類別產生部分類別。 Visual Studio for Mac 會產生輸出的屬性,以及動作的部分方法。

當 .xib 檔案變更且 Visual Studio for Mac 重新取得焦點時,設計工具檔案會自動更新。 不建議對設計工具檔案進行變更,因為下次 Visual Studio for Mac 更新檔案時,將會覆寫變更。

註冊和命名空間

Visual Studio for Mac 會使用設計工具檔案位置專案的預設命名空間來產生設計工具類別。 此行為與一般 .NET 專案命名空間產生一致。 設計工具檔案的命名空間會使用專案的「預設命名空間」及其「.NET 命名原則」設定。 如果您的項目的預設命名空間變更,重新產生的類別將會使用新的命名空間。 重新產生之後,您可能會發現部分類別不再相符。

若要讓類別可供 Objective-C 運行時間探索,Visual Studio for Mac 會將 [Register (name)] 屬性套用至 類別。 雖然 Xamarin.iOS 會自動註冊 NSObject衍生類別,但它會使用完整 .NET 名稱。 Visual Studio for Mac 所套用的屬性會覆寫 Xamarin.iOS 行為,以確保每個類別都以 .xib 檔案中使用的名稱註冊。 針對使用 IB 定義的所有自定義類別手動新增 屬性,而不需使用 Visual Studio for Mac 來產生設計工具檔案。 這樣做會使您的 Managed 類別符合預期的 Objective-C 類別名稱。

類別不能在多個 .xib 中定義,否則它們將會衝突。

非設計工具類別元件

設計工具部分類別不適合依原樣使用。 輸出是私用的,而且未指定基類。 預期每個類別在另一個檔案中會有對應的「非設計工具」類別部分。 「非設計工具」檔案會設定基類、操作輸出,並定義從機器碼具現化類別所需的建構函式。 默認的 .xib 範本具有「非設計工具」類別元件,但對於您在 .xib定義的任何其他自定義類別,您必須手動新增非設計工具元件。

需要使用部分類別進行分隔,才能彈性。 例如,多個 CodeBehind 類別可以子類別通用 Managed 抽象類,該類別會將類別子類別化為 IB 的子類別。

將 CodeBehind 類別{0}放在.xib.designer.cs設計工具檔案旁邊的{0}.xib.cs檔案是傳統的。

產生的動作和輸出

在部分設計工具類別中,Visual Studio for Mac 會產生對應至 IB 中定義之任何連線輸出的屬性,以及對應至任何已連線動作的部分方法。

輸出屬性

設計工具類別包含對應至自定義類別上定義之所有輸出的屬性。 這些屬性會啟用延遲系結。 它們是 Xamarin.iOS 至 Objective C 網橋的實作詳細數據。 將它們視為相當於私用字段,只打算從 CodeBehind 類別使用。 將公用存取子新增至非設計工具類別元件中的欄位,讓字段成為公用。

如果輸出屬性定義為具有 類型 id (相當於 NSObject),則設計工具程式代碼產生器目前會根據連接到該輸出的物件判斷最強的類型,以方便起見。 不過,未來版本可能不支援此行為。 建議您在定義自定義類別時明確輸入輸出。

動作屬性

設計工具類別包含對應至自定義類別上定義之所有動作的部分方法。 這些方法沒有實作。 部分方法的用途為兩倍:

  1. 如果您輸入 partial 非設計工具類別元件的類別主體,Visual Studio for Mac 會提供自動完成所有未實作部分方法的簽章。
  2. 部分方法簽章已套用屬性,可將它們公開給 Objective-C 世界,因此可以當做對應的動作來處理。

您可以忽略部分方法,並將 屬性套用至不同的方法,以實作動作。 或者讓它落入基類。

如果動作定義為具有 的傳送者類型 id (相當於 NSObject),則設計工具程式代碼產生器目前會根據連接到該動作的對象來決定最強的可能類型。 不過,未來版本可能不支援此行為。 建議您在定義自定義類別時明確輸入動作。

這些部分方法只會針對 C# 建立,因為 CodeDOM 不支援部分方法。 不會針對其他語言產生它們。

跨 XIB 類別使用方式

有時候,使用者想要從多個 .xib 檔案參考相同的類別,例如使用索引標籤控制器。 您可以從另一個 .xib 檔案明確參考類別定義,或在第二 個 .xib 中再次定義相同的類別名稱。

後者的情況可能會有問題,因為 Visual Studio for Mac 會個別處理 .xib 檔案。 Visual Studio for Mac 無法偵測並合併重複的定義。 當多個設計工具檔案中定義相同的部分類別時,您可能會發生多次套用 Register 屬性的衝突。 最新版本的Visual Studio for Mac 會嘗試解決衝突,但可能不一定如預期般運作。 未來,此行為可能會變成不受支援,而 Visual Studio for Mac 會讓所有 .xib 檔案中定義的所有類型,並在專案中直接顯示所有 .xib 檔案中的 Managed 程式代碼。

類型解析

IB 中使用的類型是 Objective-C 使用 Register 屬性對應至 CLR 類型的類型名稱。 產生程式代碼時,Visual Studio for Mac 會解析 CLR 類型,並將類型名稱完整限定為 Objective-C 類型。 這些 Objective-C 類型會由 Xamarin.iOS 核心包裝。

程式代碼產生器目前無法從 Objective-C 使用者程式代碼或連結庫中的類型名稱解析 CLR 類型。 在這種情況下,它會逐字輸出類型名稱。 其名稱 Objective-C 必須與類型相同,才能正確解析 CLR 類型。 CLR 類型必須與使用它的程式代碼位於相同的命名空間中。 未來的程式代碼產生器版本會考慮專案中的所有 Objective-C 類型。