Swift UI @State 确实在第一次点击时设置

Min*_*ghe 0 swiftui swiftui-state swiftui-ontapgesture

我有一个自定义视图的简单列表。需要发生的是,当选择其中一项时,它需要显示该项目的详细视图。在我的代码中,当我第一次选择一个项目时,@Statet selectedListener 不会被设置,因此详细视图不会出现。如果我继续选择先前选择的相同项目,则行为保持不变。但是,如果我选择不同的项目,它会正常工作,并且我可以返回上一个项目并查看其详细视图,而不会出现问题。这是一件非常简单的事情,我正在尝试做,只是无法弄清楚我可能做错了什么。任何帮助,将不胜感激。谢谢。

struct ListenersListView<Model>: View where Model: ActiveListenerViewModel {

@ObservedObject var viewModel: Model
@State var showDetail = false
@State var selectedListener: UserProfile? = nil

var body: some View {
    ScrollView {
        VStack(spacing:20) {
            ForEach(viewModel.allActiveListeners) { listener in
                UserImageSection(listener: listener,
                                 subtext: listener.supportAreas)
                    .onTapGesture(perform: {
                        handleTap(listener)
                    })
            }
        }
        
    }
    .padding(.horizontal,20)
    .sheet(isPresented: $showDetail, content: {
        if let listener = selectedListener {
            ListenerDetailView(listener: listener)
        }
        else {
            // It should never come here but when the first item is selected it does. The only way to not come here is to select another item after the first item has been selected.
            Text("Listener not loaded yet")
        }
    })
    
    
}

private func handleTap(_ listener: UserProfile) {
    print("Showing listener \(listener.id)")
    self.selectedListener = listener
    showDetail = true
    
}
Run Code Online (Sandbox Code Playgroud)

}

jn_*_*pdx 5

在 iOS 14 中,为了获得.sheet最新数据,您必须使用sheet(item:)而不是.sheet(isPresented:)

您可以在这里看到我的另一个答案: https: //stackoverflow.com/a/66190152/560942SwiftUI: Switch .sheet on enum, does not work

在您的具体情况下,很难说,因为我没有您的UserProfile代码,但我建议您:

  1. 摆脱你的showDetail状态变量
  2. 确保UserProfile符合Identifiable
  3. 将您的更改sheet(isPresented:)为:
.sheet(item: $selectedListener) { listener in 
  ListenerDetailView(listener: listener)
} 
Run Code Online (Sandbox Code Playgroud)