SwiftUI中如何实现变量每1秒/10秒自动更新随机数组值
要实现每隔指定时间自动切换 Banner,你需要利用 SwiftUI 的状态变量和定时器触发视图更新,具体实现如下:
1. 将常量替换为状态变量
原来的 randarrBanner 是不可变常量,无法触发视图刷新。改用 @State 修饰变量,让 SwiftUI 监听其变化:
let bannerAdArray = [1, 2] @State private var currentBannerIndex = bannerAdArray.randomElement() ?? 1 // 初始随机值,空数组时默认取1
2. 添加定时器并绑定更新逻辑
使用 Timer.TimerPublisher 创建定时任务,每隔指定时间(比如10秒)更新 currentBannerIndex 的值:
import Combine // 需要引入Combine框架 struct YourView: View { let bannerAdArray = [1, 2] @State private var currentBannerIndex = bannerAdArray.randomElement() ?? 1 @State private var timerCancellable: AnyCancellable? // 管理定时器生命周期 var body: some View { VStack { // 根据当前索引渲染对应Banner if currentBannerIndex == 1 { YandexBanner() .frame(width: 360, height: 50) } else if currentBannerIndex == 2 { MyTargetBanner() .frame(width: 360, height: 50) } } .onAppear { // 启动定时器,每10秒触发一次 timerCancellable = Timer.publish(every: 10, on: .main, in: .common) .autoconnect() .sink { [weak self] _ in // 更新随机索引,用weak self避免循环引用 self?.currentBannerIndex = self?.bannerAdArray.randomElement() ?? 1 } } .onDisappear { // 页面消失时取消定时器,防止内存泄漏 timerCancellable?.cancel() } } }
关键说明
@State变量:变量值改变时,SwiftUI 会自动重新计算视图body,实现 Banner 切换。- 定时器管理:用
AnyCancellable持有定时器,页面消失时取消,避免不必要的资源消耗。 - 安全取值:
?? 1处理数组为空的边界情况,让代码更健壮。
如果需要切换时间为1秒,只需把 Timer.publish(every: 10) 改成 every: 1 即可。
内容的提问来源于stack exchange,提问作者avldokuchaev
相关产品推荐
相关产品推荐

