Mengikat Model View pada View
Sambungkan model view dengan SwiftUI dan Combine.
Mengikat Model View pada View ialah pelajaran Swift Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Swift Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.
Menyambungkan ViewModel kepada Paparan
ViewModel hanya berguna apabila Paparan bertindak balas terhadap perubahannya. Dalam SwiftUI, reaktiviti ini dikuasakan oleh pembungkus sifat berasaskan Combine, iaitu @Published, @StateObject dan @ObservedObject.
Kesemuanya membentuk pengikatan automatik: apabila ViewModel berubah, Paparan dipaparkan semula.
ObservableObject
Untuk diperhatikan oleh SwiftUI, ViewModel mesti mematuhi ObservableObject. Protokol ini memberikannya penerbit objectWillChange yang dicetuskan sebelum sebarang perubahan.
final class CounterViewModel: ObservableObject {
@Published var count: Int = 0
func increment() {
count += 1
}
}Sifat @Published
Menandai sesuatu sifat dengan @Published akan mengeluarkan pemberitahuan perubahan secara automatik setiap kali nilainya ditetapkan.
Setiap sifat @Published menyalurkan perubahan kepada penerbit objectWillChange objek tersebut, jadi Paparan mengetahui masa yang tepat untuk dimuat semula.
final class SearchViewModel: ObservableObject {
@Published var query: String = ""
@Published var results: [String] = []
}@StateObject
@StateObject memberitahu Paparan supaya mencipta dan memiliki ViewModel. SwiftUI menciptanya sekali dan mengekalkannya sepanjang pemaparan semula Paparan itu.
Gunakan @StateObject di tempat ViewModel mula-mula dicipta.
struct CounterView: View {
@StateObject private var viewModel = CounterViewModel()
var body: some View {
Button("Count: \(viewModel.count)") {
viewModel.increment()
}
}
}@ObservedObject
@ObservedObject digunakan untuk ViewModel yang dicipta di tempat lain dan dihantar masuk. Paparan memerhatikannya tetapi tidak memiliki kitar hayatnya.
Gunakannya untuk paparan anak yang menerima ViewModel daripada induk.
struct BadgeView: View {
@ObservedObject var viewModel: CounterViewModel
var body: some View {
Text("Total: \(viewModel.count)")
}
}StateObject berbanding ObservedObject
Perbezaan pentingnya ialah pemilikan:
- @StateObject — Paparan memilikinya; ia kekal sepanjang pemaparan semula
- @ObservedObject — dihantar masuk; Paparan tidak memilikinya
Menggunakan @ObservedObject apabila sepatutnya menggunakan @StateObject boleh menyebabkan objek dicipta semula dan kehilangan state setiap kali induk dikemas kini.
Menghantar ViewModel kepada Paparan Anak
Cipta ViewModel sekali menggunakan @StateObject dalam induk, kemudian hantarkannya kepada anak yang menandakannya sebagai @ObservedObject.
struct ParentView: View {
@StateObject private var viewModel = CounterViewModel()
var body: some View {
VStack {
BadgeView(viewModel: viewModel)
Button("Add") { viewModel.increment() }
}
}
}Pengikatan Dua Hala
Untuk input seperti medan teks, anda memerlukan pengikatan dua hala. SwiftUI menjana satu pengikatan daripada sifat @Published menggunakan awalan $ pada pembungkus tersebut.
struct SearchView: View {
@StateObject private var viewModel = SearchViewModel()
var body: some View {
TextField("Search", text: $viewModel.query)
}
}Mengawal State Antara Muka
Paparan sepatutnya mendapatkan segala perkara yang dipaparkannya daripada sifat yang diterbitkan. Pemutar pemuatan, sepanduk ralat dan kandungan semuanya mengalir daripada state ViewModel.
final class FeedViewModel: ObservableObject {
enum State { case loading, loaded([String]), error(String) }
@Published var state: State = .loading
}Bertindak Balas terhadap State
Paparan memilih berdasarkan state ViewModel untuk memaparkan antara muka pengguna yang betul. Tiada kod perintah untuk menunjukkan atau menyembunyikan sesuatu, hanya pemetaan deklaratif.
struct FeedView: View {
@StateObject var viewModel = FeedViewModel()
var body: some View {
switch viewModel.state {
case .loading: ProgressView()
case .loaded(let items): List(items, id: \.self) { Text($0) }
case .error(let message): Text(message)
}
}
}Mengekalkan Kemas Kini pada Utas Utama
SwiftUI memerlukan perubahan yang diterbitkan berlaku pada utas utama. Apabila ViewModel mengemas kini state selepas kerja tak segerak, tandakannya dengan @MainActor untuk menjamin perkara ini.
@MainActor
final class ProfileViewModel: ObservableObject {
@Published var name: String = ""
func load() async {
name = await fetchName()
}
}Semakan Pantas
Uji pengetahuan anda tentang pengikatan.
Imbas Kembali
Anda telah menyambungkan ViewModel kepada Paparan menggunakan pengikatan SwiftUI:
- ObservableObject + @Published menghasilkan pemberitahuan perubahan
- @StateObject mencipta dan memiliki ViewModel
- @ObservedObject memerhatikan ViewModel yang dihantar masuk
- @MainActor mengekalkan kemas kini tak segerak pada utas utama
Dengan pengikatan reaktif yang tersedia, Paparan sentiasa mencerminkan state ViewModel terkini secara automatik.
Pelajari Swift dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 122
- Pelajaran
- 409
Soalan Lazim
Adakah pelajaran “Mengikat Model View pada View” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Swift Academy, termasuk “Mengikat Model View pada View”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Swift Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Mengikat Model View pada View”?
Sambungkan model view dengan SwiftUI dan Combine. Anda berlatih Swift Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Swift Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Swift Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “Mengikat Model View pada View” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Swift Academy ini?
Ya. Setiap pelajaran Swift Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Corak MVVM
- Mengikat Model View pada View
- Corak Coordinator
- Menguji Model View