在SwiftUI中,可以使用ObservableObject
和@Published
属性包装属性来避免在主列表中数据更改时重新创建详细视图。以下是一个示例:
首先,创建一个包含要在列表视图和详细视图之间共享的数据的ObservableObject
类:
import SwiftUI
class UserData: ObservableObject {
@Published var selectedUser: User?
}
struct User {
var name: String
var age: Int
}
然后,创建一个主列表视图,并将UserData
对象作为环境对象传递给它:
struct UserListView: View {
@EnvironmentObject var userData: UserData
var body: some View {
NavigationView {
List {
ForEach(userData.users) { user in
NavigationLink(destination: UserDetailView(user: user)) {
Text(user.name)
}
}
}
.navigationBarTitle("Users")
}
}
}
接下来,创建一个详细视图,它接收一个User
对象并显示其详细信息:
struct UserDetailView: View {
@EnvironmentObject var userData: UserData
var user: User
var body: some View {
VStack {
Text(user.name)
.font(.title)
Text("Age: \(user.age)")
}
.onAppear {
self.userData.selectedUser = self.user
}
}
}
最后,在SceneDelegate
中将UserData
对象设置为环境对象:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
let userData = UserData()
// Create the SwiftUI view and set the context as the value for the managedObjectContext environment keyPath
let contentView = UserListView().environmentObject(userData)
// Use a UIHostingController as window root view controller
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
}
}
现在,在主列表中选择一个用户,然后导航到详细视图,详细视图将显示所选用户的详细信息。通过使用@Published
属性包装selectedUser
属性,当在主列表中更改选择的用户时,详细视图不会重建,因为详细视图观察selectedUser
属性的更改。