SwiftUIシートに間違ったデータのシートが表示されます
1、2、3を表示するリストがあります。テキストをタップすると、アプリは数字をタップしたシートを開きます。ただし、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()
}
}
}
}
回答
pawello2222
複数のシートではなく、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の回答で提案されているように。