![](/img/trans.png)
[英]How to create custom updateUIViewController behavior when integrating UIKit and Swift UI?
[英]How to access CoreData in a single swift UI view with in the UIKit Project
我有一個我在 UIKit 開發的項目,但現在慢慢遷移到 Swift UI..我之前已經寫了我所有的 CoreData 邏輯,現在我想在我的 Swift UI 中訪問 CoreData 上下文......
在這里從 viewcontroller 添加 Swift UI 視圖,如下所示
let swiftUIView = ListView(date: self.date, context: context, userSession: userSession, scheduleViewModel: viewModel)
addSubSwiftUIView(swiftUIView, to: containerView)
Swift 用戶界面在這里查看
struct ListView: View {
let date: Date
let context: NSManagedObjectContext
let userSession: UserSessionTrait
@MainActor class ViewModel: ObservableObject {}
@StateObject private var viewModel = ViewModel()
var body: some View {
ScrollViewReader { scrollView in
FilteredList(date: date, context: context, userSession: userSession) { (appointment: Appointment) in
ScheduleRowView(appointment: appointment)
.id(appointment)
}
.environment(\.managedObjectContext, context)
}
.listStyle(.grouped)
}
}
struct FilteredList<T: NSManagedObject, Content: View>: View {
@FetchRequest var fetchRequest: FetchedResults<Appointment>
// this is our content closure; we'll call this once for each item in the list
let content: (Appointment) -> Content
var body: some View {
List(fetchRequest, id: \.self) { appointment in
self.content(appointment)
}
}
init(date: Date, context: NSManagedObjectContext, userSession: UserSessionTrait, @ViewBuilder content: @escaping (Appointment) -> Content) {
_fetchRequest = FetchRequest(fetchRequest: Appointment.sortedFetchRequest(in: context, userId: userSession.userId, date: date))
self.content = content
}
}
但是,當我加載此應用程序時,它因訪問不當而崩潰,並且它也在減慢這一行的bacz .environment(.managedObjectContext, context) 所以我的問題
提前致謝
您必須將上下文從 UIKit 傳遞到 SwiftUI 環境中。 您可以在舊的 Xcode SwiftUI 核心數據模板(我相信 v12)中看到它,然后我們有 SwiftUI 應用程序生命周期(抱歉,我沒有那個方便)。 它也在這個 Wenderlich 教程中。
let context = persistentContainer.viewContext
let contentView = MovieList().environment(\.managedObjectContext, context)
此外,我建議刪除您的視圖 model 對象,我們不使用 SwiftUI 中的對象。對於 SwiftUI 生成的 UIKit 視圖,視圖數據結構是 model。 給定它的值類型,我們消除了對象可能出現的錯誤。 如果您在頂部添加對象,那么您就有可能添加 SwiftUI 旨在消除的錯誤。
FetchRequest header 中有一個提示,您可能會發現它很方便:
/// If you need to separate the request and the result
/// entities, you can declare `quakes` in two steps by
/// using the request's `wrappedValue` to obtain the results:
///
/// var fetchRequest = FetchRequest<Quake>(fetchRequest: request)
/// var quakes: FetchedResults<Quake> { fetchRequest.wrappedValue }
因此,您不必使用屬性包裝器@FetchRequest
並且可以將FetchRequest
用作動態屬性。 在動態屬性中, update
函數在主體運行之前被調用,這就是FetchRequest
從環境中檢索上下文的方式。
所以例如你可以這樣做:
private var fetchRequest: FetchRequest<Appointment>
private var appointments: FetchedResults<Appointment> {
fetchRequest.wrappedValue
}
init(date: Date) {
fetchRequest = FetchRequest( // use date
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.