SwiftUI 框架

如何在 SwiftUI 使用 Preview Macro

如何在 SwiftUI 使用 Preview Macro
如何在 SwiftUI 使用 Preview Macro
In: SwiftUI 框架

SwiftUI 中的預覽(Preview)功能允許開發人員在不運行應用程序於設備或模擬器上的情況下,實時查看App的外觀。這個功能對於那些希望快速迭代設計並確保一切看起來和運作如預期的開發人員來說非常有用。隨著 iOS 17 中引入了巨集(Macro)的功能,預覽功能變得更加強大和靈活,提供了更多的自定義和靈活性。在本教學中,我們將探索如何在 SwiftUI 中使用新的預覽巨集(Preview Macro)以及一些令人興奮的新功能。

新的 #Preview 巨集

在引入新的 #Preview 巨集之前,你需要定義一個遵循 PreviewProvider 協議的 struct 來創建視圖的預覽。以下是一個範例:

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

有了 #Preview 巨集,你可以使用以下程式碼告訴 Xcode 建立預覽:

// The basic syntax
#Preview {
	ContentView()
}

// Configure the preview's name
#Preview("Pie Chart View") {
	PieChartView()
}

正如你所見,#Preview 簡化了我們定義預覽的方式。另外,你也可以向 #Preview 巨集傳遞一個名稱以配置預覽的名稱。

圖 1. 預覽基礎

你可以根據需要為任何視圖設置預覽。然後,Xcode將呈現預覽,該預覽將直接顯示在畫布中。

預覽多個視圖

圖 2. 預覽多個視圖

當使用 PreviewProvider 時,你可以使用 Group 嵌入多個視圖進行預覽。

struct ArticleView_Previews: PreviewProvider {
    static var previews: some View {
        Group {
            ArticleListView()
								.previewDisplayName("Article List View")
            
						ArticleView()
                .previewDisplayName("Article View")
        }
    }
}

如果你使用 #Preview 巨集,可以定義多個 #Preview 區塊。例如,要預覽 ArticleListViewArticleView,你可以創建兩個 #Preview 區塊,如下所示:

#Preview("Article List View") {
    ArticleListView()
}

#Preview("Article View") {
    ArticleView()
}

橫向方向的視圖預覽

圖 3. 橫向方向的視圖預覽

#Preview 巨集具有一個可選的 traits 參數,允許開發人員自定義模擬器的方向。要在橫向模式下預覽視圖,你可以將 .landscapeLeft.landscapeRight 傳遞給 traits 參數。以下是一個示例:

#Preview("Article List View", traits: .landscapeLeft) {
    ArticleListView()
}

固定佈局的預覽

traits 參數還可以接受另一個名為 .sizeThatFitsLayout 的值,這樣你就可以在沒有任何設備框架的情況下預覽視圖。

圖 4. 預覽視圖(沒有裝置框架)

除了 .sizeThatFitsLayout,你還可以使用 .fixedLayout 在特定大小下預覽視圖。

#Preview("Article List View", traits: .fixedLayout(width: 300, height: 300)) {
    ArticleListView()
}

編寫 UIKit 預覽

預覽功能不再僅限於 SwiftUI。即使你使用 UIKit,也可以使用 #Preview 巨集為你的 UIKit 視圖或視圖控制器設置預覽。要預覽視圖控制器,可以在程式碼區塊中實例化它:

#Preview {
    var controller = ViewController()
    
    return controller
}

如果你的視圖控制器是在故事板(storyboard)中設計的,也可以使用該巨集進行預覽。以下是一個示例程式碼:

#Preview("From Storyboard") {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    
    var controller = storyboard.instantiateViewController(withIdentifier: "ViewController")
    
    return controller
}

假設你已經為視圖控制器指定了一個故事板ID,可以使用 instantiateViewController 方法創建視圖控制器。以下是使用 #Preview 預覽 UIKit 視圖控制器的方式:

圖 5. 利用 Preview macro 預覽 UIKit 視圖

總結

SwiftUI 中的預覽功能使開發人員能夠實時查看App的外觀,而無需在設備或模擬器上運行App。在 iOS 17 中引入的 #Preview 巨集使預覽程式碼更加清晰和簡潔。它變得更加強大和靈活,允許你預覽使用 UIKit 開發的視圖。

作者
Simon Ng
軟體工程師,AppCoda 創辦人。著有《iOS 18 App 程式設計實戰心法》、《iOS 18 App程式設計進階攻略》以及《精通SwiftUI》。曾任職於HSBC, FedEx等跨國企業,專責軟體開發、系統設計。2012年創立AppCoda技術部落格,定期發表iOS程式教學文章。現時專注發展AppCoda業務,致力於iOS程式教學、產品設計及開發。你可以到推特與我聯絡。
評論
更多來自 AppCoda 中文版
如何在 SwiftUI App 中開發 Live Activities
SwiftUI 框架

如何在 SwiftUI App 中開發 Live Activities

Live Activities 首次於 iOS 16 推出,是 Apple 最令人興奮的更新之一,能讓 App 與使用者在即時互動上更有連結。它不再需要使用者不斷打開 App,Live Activities 可以讓資訊直接顯示在鎖定畫面和 Dynamic Island 上。
使用 Tool Calling 強化 Foundation Models 功能
AI

使用 Tool Calling 強化 Foundation Models 功能

在前幾篇教學中,我們介紹了 Foundation Models 在 iOS 26 中的運作方式,以及如何使用這個全新框架打造具備 AI 功能的應用。我們也介紹了 @Generable 巨集,它能輕鬆地將模型回應轉換為結構化的 Swift 類型。 現在,在這個 Foundation
活用 Foundation Models 的 @Generable 與 @Guide 製作測驗 App
AI

活用 Foundation Models 的 @Generable 與 @Guide 製作測驗 App

在前一篇教學中,我們介紹了 Foundation Models 框架,並示範了如何用它來進行基本的內容生成。那個過程相當簡單——你提供一個提示詞(prompt),等幾秒鐘,就能獲得自然語言的回應。在我們的範例中,我們建立了一個簡單的問答 App,讓使用者可以提問,App 則直接顯示生成的文字。 但如果回應變得更複雜——你需要把非結構化文字轉換為結構化的物件呢? 舉例來說,
很好! 你已成功註冊。
歡迎回來! 你已成功登入。
你已成功訂閱 AppCoda 中文版 電子報。
你的連結已失效。
成功! 請檢查你的電子郵件以獲取用於登入的連結。
好! 你的付費資料已更新。
你的付費方式並未更新。