首页 > 解决方案 > SwiftUI 显示来自按钮的工作表不使用多个按钮

问题描述

我有多个按钮,根据按下的按钮,我希望打开一张工作表并根据按下的按钮转到某个视图。我有这个工作在某种程度上,除了有一个我无法找到解决方案的问题。我按下的第一个按钮不起作用。它只是显示了@State var CurrentSheetView下面声明的列表中的第一个任务:

@State var showingSheet = false

@State var CurrentSheetView: Int = 0

如果您继续拉下工作表并重新选择您第一次按下的按钮,它会做同样的事情。但是,如果您选择另一个按钮,则可以。之后,所有按钮都按预期工作。为什么会这样?

这是我的其他代码,它与前几个@States 的另一个视图不同:

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的,用于从可能的任务列表中进行选择。

感谢您阅读本文,我们将不胜感激。

标签: iosswiftfunctionbuttonswiftui

解决方案


我会将按钮分解为自己的可重用视图

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,就像我在示例中所做的那样。


推荐阅读