SwiftUI 시트에 잘못된 데이터가있는 시트가 표시됨
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()
}
}
}
}
답변
pawello2222
여러 시트 대신 하나의 시트 를 만들어야 합니다.
사용 .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의 답변 에서 제안 된 대로 .