如何在SwiftUI中启动应用时显示列表内的随机问题
实现启动时展示随机问题的SwiftUI方案
要实现启动时仅展示列表中的随机一个问题,核心是从defis数组中随机选取单个元素而非遍历全部,以下提供两种可行方案:
方案一:在视图内处理随机逻辑
直接在视图中通过状态变量存储随机问题,在视图首次出现时生成随机索引获取元素:
import SwiftUI struct ViewJouer2: View { @EnvironmentObject var data: DefisList @State private var randomDefi: Defi? var body: some View { List { // 仅展示随机选中的问题 if let defi = randomDefi { DefiRow(Defi: defi) } } .onAppear { // 避免数组为空时触发崩溃 guard !data.defis.isEmpty else { return } let randomIndex = Int.random(in: 0..<data.defis.count) randomDefi = data.defis[randomIndex] } } } struct ViewJouer2_Previews: PreviewProvider { static var previews: some View { ViewJouer2() .environmentObject(DefisList()) } }
方案二:在数据模型中封装随机逻辑
将随机逻辑统一放在DefisList中,更符合MVVM架构,方便后续扩展(比如添加重新获取随机问题的功能):
修改数据代码:
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 randomDefi: Defi? init() { // 初始化时自动生成随机问题 updateRandomDefi() } // 封装随机方法,可复用 func updateRandomDefi() { guard !defis.isEmpty else { randomDefi = nil return } // 直接使用数组的randomElement()方法简化代码 randomDefi = defis.randomElement() } } struct Defi: Identifiable { var question: String var id = UUID() }
修改视图代码:
import SwiftUI struct ViewJouer2: View { @EnvironmentObject var data: DefisList var body: some View { List { if let defi = data.randomDefi { DefiRow(Defi: defi) } } } } struct ViewJouer2_Previews: PreviewProvider { static var previews: some View { ViewJouer2() .environmentObject(DefisList()) } }
注意事项
- 必须判断
defis数组是否为空,防止数组为空时出现索引越界或可选值解包崩溃; - 方案一中的
onAppear会在视图每次出现时重新生成随机问题,适合需要每次进入页面都刷新的场景; - 方案二中的
updateRandomDefi方法可以单独调用,如果需要添加“换一个问题”的按钮,直接触发该方法即可。
内容的提问来源于stack exchange,提问作者josé
相关产品推荐
相关产品推荐

