MST
星途 面试题库

面试题:Swift中SwiftUI预览如何绑定真实数据

在SwiftUI开发中,我们常常需要在预览中展示与真实应用类似的数据。假设你有一个简单的SwiftUI视图,该视图需要显示一个用户的姓名和年龄。请描述如何在SwiftUI预览中绑定真实的用户数据结构体,并展示数据。同时说明如果数据发生变化,如何在预览中实时更新。
46.5万 热度难度
编程语言Swift

知识考点

AI 面试

面试题答案

一键面试
  1. 定义用户数据结构体
    struct User {
        let name: String
        let age: Int
    }
    
  2. 创建SwiftUI视图
    import SwiftUI
    
    struct UserView: View {
        let user: User
        var body: some View {
            VStack {
                Text("Name: \(user.name)")
                Text("Age: \(user.age)")
            }
        }
    }
    
  3. 在预览中绑定真实用户数据结构体并展示
    #Preview {
        let sampleUser = User(name: "John Doe", age: 30)
        return UserView(user: sampleUser)
    }
    
  4. 数据发生变化时在预览中实时更新
    • 如果User结构体的属性是可变的,可以通过@State@Binding来实现数据变化时视图的更新。但在预览环境中,由于预览是静态的,无法直接像在运行时那样监听实时数据变化。
    • 一种变通方法是使用@ObservableObject@ObservedObject。首先将User结构体包装在一个符合ObservableObject协议的类中:
    class UserViewModel: ObservableObject {
        @Published var user: User
        init(user: User) {
            self.user = user
        }
    }
    
    • 然后修改UserView以接受UserViewModel
    struct UserView: View {
        @ObservedObject var viewModel: UserViewModel
        var body: some View {
            VStack {
                Text("Name: \(viewModel.user.name)")
                Text("Age: \(viewModel.user.age)")
            }
        }
    }
    
    • 在预览中,模拟数据变化:
    #Preview {
        let viewModel = UserViewModel(user: User(name: "John Doe", age: 30))
        let timer = Timer.publish(every: 3, on: .main, in: .common).autoconnect()
        return UserView(viewModel: viewModel)
           .onReceive(timer) { _ in
                viewModel.user.age += 1
            }
    }
    
    这里通过Timer定时修改Userage属性,从而在预览中模拟数据变化并实时更新视图。不过需要注意,这种方法主要用于展示数据变化效果,实际应用中的数据变化监听会基于真实的业务逻辑和数据来源。