ios - SwiftUI 显示来自按钮的工作表不使用多个按钮
问题描述
我有多个按钮,根据按下的按钮,我希望打开一张工作表并根据按下的按钮转到某个视图。我有这个工作在某种程度上,除了有一个我无法找到解决方案的问题。我按下的第一个按钮不起作用。它只是显示了@State var CurrentSheetView
下面声明的列表中的第一个任务:
@State var showingSheet = false
@State var CurrentSheetView: Int = 0
如果您继续拉下工作表并重新选择您第一次按下的按钮,它会做同样的事情。但是,如果您选择另一个按钮,则可以。之后,所有按钮都按预期工作。为什么会这样?
这是我的其他代码,它与前几个@State
s 的另一个视图不同:
ButtonToTrackView(tasknumber: SuggestedNumber1, newsheetview: "SuggestedNumber1")
ButtonToTrackView(tasknumber: SuggestedNumber2, newsheetview: "SuggestedNumber2")
ButtonToTrackView(tasknumber: SuggestedNumber3, newsheetview: "SuggestedNumber3")
ButtonToTrackView(tasknumber: SuggestedNumber4, newsheetview: "SuggestedNumber4")
ButtonToTrackView(tasknumber: SuggestedNumber5, newsheetview: "SuggestedNumber5")
ButtonToTrackView(tasknumber: SuggestedNumber6, newsheetview: "SuggestedNumber6")
.sheet(isPresented: $showingsheet, content: {
DetailedTrackView(sfsymbolname: task[CurrentSheetView].sfsymbolname, taskname: task[CurrentSheetView].taskname, taskdetails: task[CurrentSheetView].taskdescription, tokencount: task[CurrentSheetView].tokencount, DailyGoalProgress: $DailyGoalProgress, TabSelection: $TabSelection)
})
这是上面使用的函数ButtonToTrackView
:
func ButtonToTrackView(tasknumber: Int, newsheetview: String) -> some View {
Button(action: { CurrentSheetView = tasknumber; showingsheet.toggle(); print(CurrentSheetView); print(showingsheet)}, label: {
TrackBlockView(sfimagename: task[tasknumber].sfsymbolname, taskname: task[tasknumber].taskname, tokencount: String(task[tasknumber].tokencount))
})
}
“建议数字”是随机生成@State
的,用于从可能的任务列表中进行选择。
感谢您阅读本文,我们将不胜感激。
解决方案
我会将按钮分解为自己的可重用视图
struct MyButton: View {
@Binding var sheet: Sheet?
var title: String
var body: some View {
Button(action: {
sheet = Sheet(rawValue: title)
}, label: {
Text(title)
})
}
}
使用枚举来跟踪工作表
enum Sheet: String, CustomStringConvertible, CaseIterable, Identifiable {
case one, two, three, four
var description: String { self.rawValue }
var id: String { self.rawValue }
}
并使用这个 .sheet init
sheet<Item, Content>(item: Binding<Item?>, onDismiss: (() -> Void)? = nil, content: @escaping (Item) -> Content)
像这样
struct ContentView: View {
@State var currentSheet: Sheet?
var body: some View {
List(Sheet.allCases, id: \.self) { sheet in
MyButton(sheet: $currentSheet, title: sheet.description)
}
.sheet(item: $currentSheet) {
Text($0.description)
}
}
}
如果您希望在关闭工作表时发生某些事情,请将函数放在 .sheet init 的 onDismiss 属性中,否则将其设置为 nil,就像我在示例中所做的那样。
推荐阅读
- r - 将 ebay Feed API 与 R 一起使用
- r - 如何仅在 ggplot2 图的一侧添加边框?
- python-3.x - KeyError:设置索引时“列中都没有['minute']”
- java - 当我完成活动以获得结果时调用 OnCreate 和 onActivityResult
- c# - 对象的深拷贝
- python - 如何将不同年份的月度价格回报合并到一个数据框中?
- reactjs - 在 ReactHook 中使用 Math.random
- php - 使用 Varnish 时修改路由和 url
- laravel - 使用行数据并将其插入 Laravel 中的另一个表中
- javascript - 尝试传递 HTML 代码和一些变量时不需要的逗号