SwiftUI实现点击按钮刷新列表中的随机问题
实现SwiftUI随机切换问题的方案
方案一:视图层直接管理当前问题状态
原代码的问题在于每次视图刷新都会自动取随机问题,但没有主动触发切换的入口。我们可以给视图加一个状态变量存储当前显示的问题,再通过按钮触发重新获取随机值:
修改后的视图代码:
import SwiftUI struct ViewJouer2: View { @EnvironmentObject var data : DefisList @State private var currentDefi: Defi? // 保存当前显示的问题 var body: some View { VStack { List { if let defi = currentDefi { DefiRow(Defi: defi) } } Button("切换问题") { // 点击按钮时重新获取随机问题 currentDefi = data.defis.randomElement() } .padding() .buttonStyle(.borderedProminent) } .onAppear { // 视图加载时初始化第一个随机问题 currentDefi = data.defis.randomElement() } } } struct ViewJouer2_Previews: PreviewProvider { static var previews: some View { ViewJouer2() .environmentObject(DefisList()) } }
关键说明:
- 用
@State变量固定当前显示的问题,避免视图刷新时自动切换 onAppear方法保证启动时加载第一个随机问题- 按钮点击事件触发
currentDefi重新赋值,自动更新视图
方案二:MVVM架构下用ViewModel管理状态
如果想让逻辑更清晰,适合后续扩展,可以把当前问题的状态放到ViewModel里管理:
首先修改数据模型代码:
import SwiftUI class DefisList : ObservableObject { @Published var defis = [ Defi(question: "How old are you?"), Defi(question: "How are you"), Defi(question: "What is your name?"), ] @Published var currentDefi: Defi? // 新增:当前显示的问题 init() { // 初始化时设置第一个随机问题 currentDefi = defis.randomElement() } // 新增:切换随机问题的方法 func switchRandomDefi() { currentDefi = defis.randomElement() } } struct Defi : Identifiable { var question : String var id = UUID() }
然后修改视图代码:
import SwiftUI struct ViewJouer2: View { @EnvironmentObject var data : DefisList var body: some View { VStack { List { if let defi = data.currentDefi { DefiRow(Defi: defi) } } Button("切换问题") { data.switchRandomDefi() } .padding() .buttonStyle(.borderedProminent) } } } struct ViewJouer2_Previews: PreviewProvider { static var previews: some View { ViewJouer2() .environmentObject(DefisList()) } }
这个方案的优势:把状态逻辑从视图中剥离,后续要加比如“避免重复切换到同一个问题”“记录历史问题”这类功能时,直接在ViewModel里修改即可,视图不需要改动。
内容的提问来源于stack exchange,提问作者josé
相关产品推荐
相关产品推荐

