SwiftUI शीट गलत डेटा वाली शीट दिखाती है

Aug 15 2020

मेरे पास एक सूची है जो 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 Aug 15 2020 at 20:37

आपको कई शीट के बजाय एक शीट बनाने की आवश्यकता है ।

यदि आप उपयोग करना चाहते हैं तो आप .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 के उत्तर में प्रस्तावित है ।