SwiftUI sayfası yanlış veriye sahip sayfayı gösteriyor

Aug 15 2020

1, 2 ve 3'ü görüntüleyen bir listem var. Metne dokunduğumda, uygulama numaraya dokunulan bir sayfa açar. Bununla birlikte, ikinci veya üçüncü satırdaki metne dokunursam, sayfada görüntülenen sayı hala 1'dir. Neyi yanlış yapıyorum?

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

Yanıtlar

pawello2222 Aug 15 2020 at 20:37

Birden çok sayfa yerine bir sayfa oluşturmanız gerekir .

Kullanmak isterseniz .sheet(isPresented:content:)şunları yapabilirsiniz:

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

Alternatif olarak şunları kullanabilirsiniz .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)")
        }
    }
}

DÜZENLE

Kullanmaya karar verirseniz, .sheet(item:content:)bir uzantı ekleyebilirsiniz Int(uyan özel bir yapı oluşturmak yerine Identifiable):

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

Asperi'nin cevabında önerildiği gibi .