Trang tính SwiftUI hiển thị trang tính có dữ liệu sai

Aug 15 2020

Tôi có một danh sách hiển thị 1, 2 và 3. Khi nhấn vào văn bản, ứng dụng sẽ mở một trang tính với số được nhấn. Tuy nhiên, nếu tôi nhấn vào văn bản ở hàng thứ hai hoặc thứ ba, số hiển thị trong trang tính vẫn là 1. Tôi đang làm gì sai?

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

Trả lời

pawello2222 Aug 15 2020 at 20:37

Bạn cần tạo một trang tính thay vì nhiều trang tính.

Nếu muốn sử dụng .sheet(isPresented:content:)bạn có thể làm như sau:

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

Ngoài ra, bạn có thể sử dụng .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)")
        }
    }
}

BIÊN TẬP

Nếu quyết định sử dụng, .sheet(item:content:)bạn có thể thêm tiện ích mở rộng vào Int(thay vì tạo cấu trúc tùy chỉnh phù hợp với Identifiable):

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

như được đề xuất trong câu trả lời của Asperi .