iT邦幫忙

2024 iThome 鐵人賽

DAY 28
0
Mobile Development

SwiftUI快速入門30天系列 第 28

Day28 - 介紹常用的SwiftUI Warp @開頭的包裝屬性

  • 分享至 

  • xImage
  •  

以下是前20個SwiftUI中的屬性包裝器 使用場合及範例程式碼:

屬性包裝器 描述 使用場合 程式範例
@State 管理視圖內部的局部狀態,當狀態變更時,視圖會自動重新渲染。 單一視圖內部的狀態管理,如按鈕狀態、表單輸入。 @State private var isOn: Bool = false var body: some View { Toggle("Switch", isOn: $isOn) }
@Binding 允許子視圖修改父視圖的狀態,透過雙向綁定狀態。 當子視圖需要修改父視圖的狀態時使用。 struct ChildView: View { @Binding var isOn: Bool var body: some View { Toggle("Switch", isOn: $isOn) } }
@StateObject 初始化並管理ObservableObject,視圖負責管理物件的生命週期。 在視圖內建立並持有ViewModel等狀態物件。 class ViewModel: ObservableObject { @Published var count = 0 } struct ContentView: View { @StateObject var viewModel = ViewModel() var body: some View { Text("\(viewModel.count)") } }
@ObservedObject 監控外部的ObservableObject,當物件的狀態變更時通知視圖更新。 當父視圖需要傳遞物件給子視圖進行觀察時。 class ViewModel: ObservableObject { @Published var count = 0 } struct ParentView: View { @ObservedObject var viewModel = ViewModel() var body: some View { ChildView(viewModel: viewModel) } }
@EnvironmentObject 將物件放置在環境中,使子視圖可以訪問並共享該物件。 當多個視圖需要共享相同資料,但不希望手動傳遞時。 class UserSettings: ObservableObject { @Published var username: String = "User" } struct ContentView: View { @EnvironmentObject var settings: UserSettings var body: some View { Text(settings.username) } }
@Published 用於自訂的ObservableObject類型內,當屬性變更時通知觀察者。 定義在ObservableObject內,標記會影響視圖的狀態屬性。 class ViewModel: ObservableObject { @Published var count = 0 }
@Environment 提供從環境中提取系統相關的值,如配色方案、顯示比例等。 需要訪問系統環境資料,如裝置的設定或環境狀態時。 @Environment(\.colorScheme) var colorScheme
@AppStorage 用戶預設存儲的包裝器,讓SwiftUI視圖自動綁定到UserDefaults 當需要將簡單數據持久化並在App中保持共享狀態時使用。 @AppStorage("username") var username: String = ""
@SceneStorage @AppStorage類似,但專門用於儲存場景(scene)特定的狀態。 儲存應用程序在多個場景中各自的狀態,如在iPad上多個場景。 @SceneStorage("textFieldContent") var text: String = ""
@FetchRequest 與Core Data整合,透過此包裝器進行資料的查詢操作。 在SwiftUI中直接綁定Core Data資料查詢結果到視圖。 @FetchRequest(entity: User.entity(), sortDescriptors: []) var users: FetchedResults<User>
@FocusState 控制視圖的焦點狀態,特別是用於表單輸入中的焦點管理。 需要動態控制表單輸入欄位的焦點時。 @FocusState private var isFocused: Bool
@GestureState 管理手勢的中間狀態,當手勢改變時更新其值。 當需要管理長按、拖動等手勢的狀態時。 @GestureState private var dragOffset: CGSize = .zero
@MainActor 確保程式碼在主執行緒上執行,特別是需要更新UI的程式碼。 當進行需要更新UI的非同步操作時。 @MainActor func updateUI() { }
@NSManaged 用於Core Data的屬性,標記需要由Core Data管理的屬性。 在Core Data中使用,用來聲明由Core Data處理的屬性。 @NSManaged var name: String
@UIApplicationDelegateAdaptor 允許將UIApplicationDelegate適配到SwiftUI中。 需要將應用程式委派的生命週期事件整合到SwiftUI時。 @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
@ViewBuilder 用來構建複雜的視圖層次結構,允許返回多個視圖。 當視圖需要動態構建且包含多個子視圖時使用。 @ViewBuilder var body: some View { Text("Hello") Text("World") }
@ScaledMetric 允許開發者依據用戶設置的動態字體大小來縮放視圖中的數字。 需要根據用戶字體設置動態調整數值大小時。 @ScaledMetric var scale: CGFloat = 1.0
@Namespace 用來建立動畫的命名空間,特別是matchedGeometryEffect動畫。 用於在兩個視圖間進行動畫過渡。 @Namespace var animationNamespace
@AttributedStringBuilder 允許構建富文本內容。 當需要在SwiftUI中使用富文本(多樣式文本)時使用。 @AttributedStringBuilder var attributedText: AttributedString { ... }

總結:

這些屬性包裝器從管理局部狀態(@State@Binding),到處理複雜資料模型(@StateObject@ObservedObject@EnvironmentObject),再到處理系統環境和持久化數據(如@AppStorage@SceneStorage@Environment),幫助SwiftUI開發者更輕鬆地管理狀態、資料流和環境設置。

多的不只這些常用的列進去
!!!這包裝屬性是SwiftUI精神靈魂!!!做此表謹記備查


上一篇
Day27 - AppStorage 和 UserDefaults在App存簡單資料
下一篇
Day29 - SwiftUI綜合練習ToDo List
系列文
SwiftUI快速入門30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言