首页 > 解决方案 > SwiftUI View Code 似乎被调用了两次。这里有什么问题?

问题描述

.sheet我有一个在 SwiftUI中被调用的视图。但是,当显示此工作表时,我在控制台中收到调试“Tapped”打印,然后出现以下错误:

Warning: Attempt to present <_TtGC7SwiftUIP13$7fff2c9bdf5c22SheetHostingControllerVS_7AnyView_: 0x7f8f1d7400f0>  on <_TtGC7SwiftUI19UIHostingControllerVVS_22_VariadicView_Children7Element_: 0x7f8f17e0dae0> which is already presenting (null)

我不确定是什么导致了这个错误,但据我了解,这是由于视图被调用了两次。我不确定视图是如何被调用两次的,或者即使是,这就是我在这里问的原因。下面是实际包含我的列表的 NavigationView 的主视图

struct AllTablesView: View {
    
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Table.getAllTables()) var tables: FetchedResults<Table>
    
    @State private var tableTapped: Table = Table()
    
    @State private var isModal = false
    
    var body: some View {
        NavigationView {
            List {
                ForEach(self.tables) { table in
                    tableCellView(tableNumber: table.number, clean: table.clean, inUse: table.inUse)
                        .onTapGesture {
                            self.tableTapped = table
                            self.isModal = true
                            print("tapped")
                    }
                }
                .onDelete { indexSet in
                    let deletedTable = self.tables[indexSet.first!]
                    self.managedObjectContext.delete(deletedTable)
                    
                    do {
                        try self.managedObjectContext.save()
                    } catch {
                        print(error)
                    }
                }
                .sheet(isPresented: $isModal){
                    TableStatusView(table: self.tableTapped)
                        .environment(\.managedObjectContext, self.managedObjectContext)
                }
                
            }
            .navigationBarTitle("All Tables")
            .navigationBarItems(leading: EditButton(), trailing:
                HStack {
                    DeleteAllTablesButton()
                    
                    AddTableButton()
            })
        }
    }
}

而且,无论出于何种原因,这是问题所在,这是我的视图代码,标题为“TableStatusView”

struct TableStatusView: View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Table.getAllTables()) var tables: FetchedResults<Table>
    
    @State var table: Table
    
    var body: some View {
        VStack {
            Form {
                Section {
                    Text("Table \(table.number)")
                }.padding(.all, 10.0)
                
                Section {
                    Toggle(isOn: $table.inUse) {
                        Text("In Use")
                    }.padding(.all, 10.0)
                    
                    Toggle (isOn: $table.clean) {
                        Text("Clean")
                    }.padding(.all, 10.0)
                }
            }
        }
    }
}

我收到此错误是否有原因,或者为什么我的视图被调用了两次?它实际上是被调用了两次还是我在这里做错了什么?我知道我的代码的某些部分可能会被缩小或写得更好,但这只是我第一次深入 SwiftUI,除了基本的东西之外我没有太多的经验。谢谢!

标签: iosswiftxcodeswiftui

解决方案


我从来没有找到问题的解决方案,但我确实解决了 NavigationLink 问题并换回使用它。我正在使用“.onTapGesture”来获得一个点击手势,然后生成一个 NavigationLink,认为这是一个动作。我了解到,NavigationLink 实际上或多或少是一个容纳内容的容器,因此我将 .onTapGesture 和 TableCellView() 函数调用替换为以下内容:

NavigationLink(destination: TableStatusView(table: table)) {
    tableCellView(tableNumber: table.number, clean: table.clean, inUse: table.inUse)
}

并为我解决了这个问题。我仍然看到一些错误,但从一些 google-fu 发现它们是 SwiftUI 的当前错误。SwiftUI 2.0 可能会修复其中一些问题


推荐阅读