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

2024-03-16

我有一个显示 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()
            }
        }
    }
}

你需要创建one片材而不是multiple sheets.

如果你想使用.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)")
        }
    }
}

EDIT

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

extension Int: Identifiable {
    public var id: Int { self }
}

如提议的阿斯佩里的回答 https://stackoverflow.com/a/63089069/8697793.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SwiftUI 工作表显示包含错误数据的工作表 的相关文章

随机推荐