Как перестать показывать подробное представление, когда элемент в основном представлении удален?

У меня есть представления Master и Detail. Пользователь может нажать на элемент в основном представлении, и сведения об этом элементе отобразятся в подробном представлении. Также пользователь может удалять элементы из основного представления — в этом случае в подробном представлении должен отображаться текст Пожалуйста, выберите элемент..

Моя проблема заключается в том, что когда я удаляю элемент в основном представлении на iPadOS в ландшафтном режиме, в подробном представлении по-прежнему отображается содержимое этого удаленного элемента.

Моя цель - показать текст Пожалуйста, выберите элемент. как только элемент удален. Например, если элемент 2 выбран и удаляется, отображать только Text("Please select an item.") вид после операции удаления. Буду признателен за любые предложения, спасибо!

struct DetailView: View {
    var item: String
    var body: some View {
        Text("Detail of \(item)")
    }
}

struct ContentView: View {
    @State private var items = ["Item 1", "Item 2", "Item 3"]

    var body: some View {
        NavigationView {
            List {
                ForEach(items, id: \.self) { item in
                    NavigationLink(destination: DetailView(item: item)) {
                        Text(item)
                    }
                }
                .onDelete(perform: delete)
            }
            Text("Please select an item.")
        }
    }

    func delete(at offsets: IndexSet) {
        items.remove(atOffsets: offsets)
    }
}

person Igor R.    schedule 28.01.2021    source источник


Ответы (1)


Попробуйте следующее (не проверено, просто идея - при удалении в стеке нет нового выбора/навигации, поэтому представление сведений не обновляется, поэтому мы можем попытаться принудительно принудительно обновить это обновление):

struct ContentView: View {
    @State private var items = ["Item 1", "Item 2", "Item 3"]

    @State private var refreshID = UUID()    // << this !!

    var body: some View {
        NavigationView {
            List {
                ForEach(items, id: \.self) { item in
                    NavigationLink(destination: DetailView(item: item)) {
                        Text(item)
                    }
                }
                .onDelete(perform: delete)
            }
            Text("Please select an item.")
        }
        .id(refreshID)                    // << here !!
    }

    func delete(at offsets: IndexSet) {
        items.remove(atOffsets: offsets)
        refreshID = UUID()               // << here !!
    }
}
person Asperi    schedule 28.01.2021