繁体   English   中英

SwiftUI NavigationView 在工作表被解除时向堆栈添加额外的视图

[英]SwiftUI NavigationView adding extra view onto stack when sheet is dismissed

我有一个使用 NavigationLink 的 ForEach 列表,点击时会显示详细视图。 DetailsView 包含一个用于将详细信息保存到数组中的工作表。 保存后,工作表被关闭,但导航堆栈上放置了一个额外的 DetailsView,因此我需要点击两次返回链接才能返回列表。

我可能做错了什么,因为我对 swiftui 比较陌生,但无法确定是什么。

感兴趣的三件事:

  1. 在 ListView 中,我使用了.navigationViewStyle(StackNavigationViewStyle())。 删除后,问题就消失了,但 iPad 对于 ListView 来说变得很乱。

  2. 我正在使用 insert(at: 0) 在我的数组中添加数据,因为我想要列表顶部的最新数据。 如果我改用 append ,问题就会消失 go 。 想要列表顶部最近保存的项目,我添加了一个排序,但是排序会导致重复问题再次出现。

  3. 只有在选择列表中创建的第一项(数组中的最后一项)然后将新项保存到数组中时,才会出现此问题。

脚步:

  1. 首先点击点击此处,然后点击保存,输入名称,然后点击保存。
  2. 单击选项卡栏项目已保存。
  3. 单击“已保存项目”列表中第 1 步中的列表项目(导航栏应显示“< 已保存项目”)。
  4. 单击保存,输入另一个名称,然后单击保存。 此时,复制视图以“< Back”作为前导导航栏项目出现,单击它会将您带到原始详细视图,然后单击“< Saved Items”将您带到列表视图。

我做错了什么或者我应该做些什么更好?

xcode 12.4/iOS 14.1

剥离代码以重现:

struct TestModel: Identifiable, Codable {
   private(set) var id: UUID
   var name: String
}

class AppData: ObservableObject {
   @Published var testList = [TestModel]()
}

struct NewView: View {
   var body: some View {
      NavigationView {
         NavigationLink(
            destination: DetailView(item: TestModel(id: UUID(), name: ""))) {
            Text("Tap here first")
         }.navigationBarTitle("Main View", displayMode: .inline)
      }.navigationViewStyle(StackNavigationViewStyle())
   }
}

struct ListView: View {
   @EnvironmentObject var appData: AppData
   
   var body: some View {
      NavigationView {
         List {
            ForEach(appData.testList) { item in
               NavigationLink(destination: DetailView(item: item)) {
                  Text(item.name)
               }
            }
         }
         .navigationBarTitle("Saved Items", displayMode: .inline)
      }
      .navigationViewStyle(StackNavigationViewStyle())  // remove this and issue goes away, but iPad gets "messy".
   }
}

struct DetailView: View {
   @State private var isSaveShowing = false
   @State var item: TestModel
   
   var body: some View {
      ScrollView(.vertical, showsIndicators: false) {
         VStack(alignment: .center, spacing: 20)  {
            Text(item.name)
            Button(action: {
               isSaveShowing = true
            }) {
               Text("Save".uppercased())
            }.sheet(isPresented: $isSaveShowing) {
               SaveView(currentItem: item)
            }
         }
      }
   }
}

struct SaveView: View {
   var currentItem: TestModel
   @State private var name = ""
   @EnvironmentObject var appData: AppData
   @Environment(\.presentationMode) var presentationMode
   
   var body: some View {
      NavigationView {
         Form {
            Section(header: Text("Enter Name ".uppercased())
            ) {
               TextField("Name (required)", text: $name)
            }
         }
         .navigationBarItems(
            trailing: Button(action: {
               // appData.testList.append(TestModel(id: UUID(), name: name))  // using append instead of insert also resolves issue...
               appData.testList.insert(TestModel(id: UUID(), name: name), at: 0)
               presentationMode.wrappedValue.dismiss()
            }) {
               Text("Save")
            }
         )
      }
      .navigationViewStyle(StackNavigationViewStyle())
   }
}

struct ContentView: View {
   var appData = AppData()
   
   var body: some View {
      TabView {
         NewView().tabItem {
            Image(systemName: "rectangle.stack.badge.plus")
            Text("Calculate")
         }
         ListView().tabItem {
            Image(systemName: "tray.and.arrow.down")
            Text("Saved")
         }
      }
      .environmentObject(appData)
   }
}

显然,这一定是 SwiftUI 中的错误。 使用 Xcode 12.5 beta 3 和 iOS 14.5 运行相同的代码,问题不再发生。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM