[英]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.