SwiftUI中Alert按钮无法调用函数的问题排查
问题诊断与修复方案
核心错误:变量名不匹配 + 条件限制导致按钮未触发
状态变量拼写不一致
你在onTapGesture中设置的弹窗触发变量是isShowingQuestionWechsel,但Alert绑定的状态却是$isShowingQuestionAuswechslung——两个变量名的拼写差异(WechselvsAuswechslung)会导致状态不同步,即使弹窗能弹出,后续按钮动作也可能因状态异常失效。Alert按钮的条件限制
OK按钮被包裹在if self.isWechselRunning判断中,如果isWechselRunning为false,按钮组根本不会渲染,自然无法执行doOnTap。你需要确认点击列表项时,isWechselRunning是否被正确设为true。
次要隐患:索引获取方式不安全
你用matchData.firstIndex(of: oneMatchDataSet)!获取索引存在风险:
- 若
matchData元素未遵循Equatable协议,代码直接报错; - 若存在重复元素,会返回第一个匹配项的索引,而非当前点击的元素索引。
正确写法是让ForEach直接返回索引:
ForEach(Array(matchData.enumerated()), id: \.element.id) { index, oneMatchDataSet in // 直接使用index,无需额外计算 }
修正后的关键代码片段
// 修正ForEach索引逻辑 ForEach(Array(matchData.enumerated()), id: \.element.id) { index, oneMatchDataSet in if oneMatchDataSet.isPlaying && oneMatchDataSet.player != nil { .onTapGesture(perform: { print("onTapGesture...Start") self.actualIndex = index self.isWechselRunning = true // 确保按钮条件满足 self.isShowingQuestionAuswechslung = true // 统一弹窗状态变量名 print("onTapGesture...End") }) .contextMenu { Group { ... } } } } // 修正Alert按钮逻辑(若无需isWechselRunning限制,直接移除条件) .alert("\(tmpQuestion)", isPresented: $isShowingQuestionAuswechslung) { Button("Abbrechen", action: { ... }) Button("Ok", action: { print("Hier OK Start") doOnTap(index: self.actualIndex, matchData: self.matchData, einAus: "EIN") print("Hier OK Ende") }) }
额外排查点
- 确认
actualIndex是@State修饰的可修改变量(如@State var actualIndex: Int = 0); - 检查
doOnTap内部是否有条件拦截(如索引越界、数据状态不满足),可在函数开头加日志排查; - 若
doOnTap需要修改matchData,确保matchData由@State/@ObservedObject/@StateObject管理,否则修改不会生效。
内容的提问来源于stack exchange,提问作者Jens
相关产品推荐
相关产品推荐

