ToolbarItem中的按钮无法关闭工作表

时间:2020-09-14 04:05:32

标签: swiftui ios14 xcode12

在Xcode 12 Beta 6中,在ToolbarItem内的按钮操作内关闭工作表不起作用。

我的工作表视图如下:

NavigationView {
    Form {
        Section {
            TextField("Name", text: $name)
        }
    }
    .navigationTitle("New Thing")
    .toolbar {
        ToolbarItem(placement: .cancellationAction) {
            Button(action: {
                self.presentation.wrappedValue.dismiss()
            }, label: {
                Text("Cancel")
            })
        }
        ToolbarItem(placement: .confirmationAction) {
            Button(action: {
                do {
                    // some saving logic
                    try managedObjectContext.save()
                    self.presentation.wrappedValue.dismiss()
                } catch {
                    print("didn't save due to \(error.localizedDescription)")
                }
            }, label: {
                Text("Save")
            })
        }
    }
}

编辑:这是我构造工作表的方式

var body: some View {
        List {
            ForEach(results) { result in
                HStack {
                    NavigationLink(destination: SingleResultView(result: result)) {
                        SingleResultRowView(result: result)
                    }
                }
            }
            .onDelete(perform: deleteResult)
        }
        .navigationTitle("All Results")
        .toolbar {
            ToolbarItem(placement: .primaryAction) {
                Button(action: {
                    self.isNewResultSheetPresented.toggle()
                }, label: {
                    Image(systemName: "plus.circle.fill")
                        .resizable()
                        .frame(width: 30, height: 30, alignment: .center)
                })
                .sheet(isPresented: $isNewResultSheetPresented) {
                    NewResultView()
                    // ^ this contains the code above
                        .environment(\.managedObjectContext, self.managedObjectContext)
                }
            }
        }
    }

首次显示工作表时,立即出现控制台日志:

2020-09-13 20:52:02.333679-0700 MyApp[2710:89263] 
[Presentation] Attempt to present <_TtGC7SwiftUI22SheetHostingControllerVS_7AnyView_: 0x1027b7890> on 
<_TtGC7SwiftUI19UIHostingControllerGVS_15ModifiedContentVS_7AnyViewVS_12RootModifier__: 0x10270d620> 
(from <_TtGC7SwiftUIP10$194f39bd428DestinationHostingControllerVS_7AnyView_: 0x103605930>) 
which is already presenting <_TtGC7SwiftUI22SheetHostingControllerVS_7AnyView_: 0x103606d60>.

我只能向下滑动才能解开纸页。

作为参考,我回到了较旧的提交,在该提交中我使用了NavigationBarItems,并且运行良好。但是据我了解,在这种情况下,我应该使用ToolbarItem。

有人知道为什么旧的self.presentation.wrappedValue.dismiss()在这里不起作用,还是为什么工作表要被展示两次?

1 个答案:

答案 0 :(得分:2)

将工作表移出工具栏,就像

var body: some View {
    List {
        ForEach(results) { result in
            HStack {
                NavigationLink(destination: SingleResultView(result: result)) {
                    SingleResultRowView(result: result)
                }
            }
        }
        .onDelete(perform: deleteResult)
    }
    .navigationTitle("All Results")
    .sheet(isPresented: $isNewResultSheetPresented) {     // << here !!
        NewResultView()
        // ^ this contains the code above
            .environment(\.managedObjectContext, self.managedObjectContext)
    }
    .toolbar {
        ToolbarItem(placement: .primaryAction) {
            Button(action: {
                self.isNewResultSheetPresented.toggle()
            }, label: {
                Image(systemName: "plus.circle.fill")
                    .resizable()
                    .frame(width: 30, height: 30, alignment: .center)
            })
        }
    }
}