You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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é

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 09:25:43