SwiftUI 工作表显示数据错误的工作表

Posted

技术标签:

【中文标题】SwiftUI 工作表显示数据错误的工作表【英文标题】:SwiftUI sheet shows sheet with wrong data 【发布时间】:2020-08-15 13:26:41 【问题描述】:

我有一个显示 1、2 和 3 的列表。当点击文本时,应用程序会打开一个带有点击数字的工作表。但是,如果我点击第二行或第三行的文本,工作表中显示的数字仍然是 1。我做错了什么?

import SwiftUI

struct ContentView: View 
    
    var numbers = [1, 2, 3]
    @State private var shouldPresentSheet = false
    
    var body: some View 
        List(self.numbers, id: \.self)  number in
            Text("number: \(number)").sheet(isPresented: self.$shouldPresentSheet) 
                Text("This is sheet number \(number)")
            .onTapGesture 
                self.shouldPresentSheet.toggle()
            
        
    

【问题讨论】:

考虑这个解决方案***.com/a/63089069/12299030 - 你也有同样的问题。 @Asperi 我完全忘记了扩展Int,谢谢。 【参考方案1】:

您需要创建 一个 工作表而不是 多个 工作表。

如果您想使用.sheet(isPresented:content:),您可以执行以下操作:

struct ContentView: View 
    var numbers = [1, 2, 3]
    @State private var selectedNumber: Int?

    var body: some View 
        List(numbers, id: \.self)  number in
            Text("number: \(number)")
                .onTapGesture 
                    self.selectedNumber = number
                
        
        .sheet(isPresented: binding) 
            Text("This is a sheet number \(self.selectedNumber ?? 0)")
        
    

    var binding: Binding<Bool> 
        .init(
            get:  self.selectedNumber != nil ,
            set:  _ in 
        )
    


您也可以使用.sheet(item:content:):

struct Model: Identifiable 
    let id: Int


struct ContentView: View 
    var numbers = [1, 2, 3].map(Model.init)
    @State private var selectedNumber: Model?

    var body: some View 
        List(numbers, id: \.id)  number in
            Text("number: \(number.id)")
                .onTapGesture 
                    self.selectedNumber = number
                
        
        .sheet(item: $selectedNumber)  item in
            Text("This is a sheet number \(item.id)")
        
    

编辑

如果您决定使用.sheet(item:content:),您可以向Int 添加扩展(而不是创建符合Identifiable 的自定义结构):

extension Int: Identifiable 
    public var id: Int  self 

如Asperi's answer 中建议的那样。

【讨论】:

以上是关于SwiftUI 工作表显示数据错误的工作表的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:关闭第一个工作表时如何显示第二个工作表

SwiftUI-> 线程 1:致命错误:未找到 MyObject.Type 类型的可观察对象(工作表中的 EnvironmentObject)

在 swiftUI 中显示来自多个选项的工作表

SwiftUI:工作表第一次无法显示正确的值

SwiftUI:从工作表导航到新视图

SwiftUI:.sheet() 在关闭当前工作表时不会使用预期数据转到上一个视图