簡體   English   中英

從 SwiftUI 的詳細信息視圖中刪除列表中的最后一項不會彈出詳細信息視圖

[英]Deleting the last item in a list from the detail view in SwiftUI does not pop the detail view

我正在開發一個應用程序,在從詳細信息視圖中刪除列表中的最后一項時遇到了 List 和 NavigationLink 的奇怪行為。 我使用的是 iOS 13 和 Xcode 11,我制作了一個重現行為的簡化版本:

import SwiftUI

struct ListView: View {
    @State private var content = [Int](0..<10) {
        didSet {
            print(content)
        }
    }

    var body: some View {
        NavigationView {
            List(content, id: \.self) { element in
                NavigationLink(
                    destination: DetailView(
                        remove: {
                            DispatchQueue.global(qos: .userInitiated).asyncAfter(deadline: .now() + 1) { // Asynchronous network request
                                DispatchQueue.main.async {
                                    self.content.removeAll { $0 == element } // When request was successfull remove element from list
                                }
                            }
                        }
                    )
                ) {
                    Text("Element #\(element)")
                }
            }
        }
    }
}

struct DetailView: View {

    let remove: () -> Void

    init(remove: @escaping () -> Void) {
        self.remove = remove
    }

    var body: some View {
        VStack {
            Text("Hello world!")

            Button(
                action: {
                    self.remove()
                }
            ) {
                Image(systemName: "trash.circle")
                    .imageScale(.large)
            }
        }
    }
}

要重建錯誤,請選擇列表中的最后一項,然后按垃圾桶刪除。 您可能會注意到,視圖不會像列表中的其他項目一樣消失。 但是,如果您按回,列表將正確刪除最后一個項目。 這也顯示在此gif 中 當按下垃圾桶時,列表的狀態變化會打印到控制台。

我注意到刪除特定項目似乎不是問題,因為刪除隨機項目時也會發生這種情況。 如果我刪除所選項目並在最后添加新項目,它確實可以正常工作。 所以它可能是由縮小數組的大小引起的。

我還找到了幾種解決方法。 就像使用 .id(UUID()) 修改 NavigationView 一樣,但這會刪除動畫。 另一種解決方案是使用 PresentationMode 關閉視圖,並在消失時從列表中刪除該項目,但我寧願使用不同的解決方案。

為了查看它是否與 iOS 13 或 Xcode 11 相關,我在最新的 iOS 14 和 Xcode 12(目前是 beta 5)測試版上對其進行了測試。 此處的詳細視圖不會被任何選定的項目關閉。

有沒有人以前遇到過這個問題,或者至少可以解釋為什么會這樣?

編輯:添加模擬網絡請求以更好地說明具體問題。

SwiftUI 在那里表現得有點奇怪,我想......

您可以明確告訴 SwiftUI 關閉 DetailView。 為此,您需要稍微修改 DetailView:

struct DetailView: View {
    @Environment(\.presentationMode) var presentationMode
    
    let remove: () -> Void
    
    init(remove: @escaping () -> Void) {
        self.remove = remove
    }
    
    var body: some View {
        VStack {
            Text("Hello world!")
            
            Button(
                action: {
                    self.remove()
                    self.presentationMode.wrappedValue.dismiss()
                }
            ) {
                Image(systemName: "trash.circle")
                    .imageScale(.large)
            }
        }
    }
}

(另請參閱: iOS SwiftUI:以編程方式彈出或關閉視圖

對我來說,這似乎有效,即使是最后一行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM