SwiftUI 工作表显示数据错误的工作表 [英] SwiftUI sheet shows sheet with wrong data

查看:22
本文介绍了SwiftUI 工作表显示数据错误的工作表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a list that displays 1, 2, and 3. When the text is tapped the app opens a sheet with the number tapped. However, if I tap the text in the second or third row, the number displayed in the sheet is still 1. What am I doing wrong?

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()
            }
        }
    }
}

推荐答案

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

You need to create one sheet instead of multiple sheets.

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

If you want to use .sheet(isPresented:content:) you can do the following:

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):

If you decide to use .sheet(item:content:) you can add an extension to Int (instead of creating a custom struct conforming to Identifiable):

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

Asperi 的回答中所提议.

这篇关于SwiftUI 工作表显示数据错误的工作表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆