在一种情况下而非另一种情况下的SwiftUI视图层次结构警告

时间:2019-10-05 02:05:33

标签: ios xcode swiftui

我最初设计了一个SwiftUI列表/详细信息应用程序,其中包括一个带有一个选项卡的TabView作为添加新记录的视图。那几乎可以预期。我想更改选项卡中的添加功能,以从导航栏按钮调用它。在两种情况下,我都使用完全相同的视图。从导航栏按钮调用视图时,出现tableView层次结构错误:

[TableView]仅警告一次:通知UITableView布局其可见单元格,然后 不在视图层次结构中的其他内容(表视图或其其中之一) 尚未将Superviews添加到窗口中)。...+还有更多chat不休

TabView调用:

    AddNewPatient().tabItem ({
        Image(systemName: "plus.circle")
        Text("Add")
    })
    .tag(2)

然后调用导航按钮:

    .navigationBarItems(trailing: NavigationLink(destination: AddNewPatient()) {
        Text("Add Patient")
    })      

对于从导航栏按钮调用视图时为什么视图不属于层次结构感到困惑。到目前为止,我还没有遇到过应用程序崩溃的情况,但显然该应用程序并不令人满意。数据确实已保存并显示在列表中。 (核心数据存储)

我在UITableViewAlertForLayoutOutsideViewHierarchy上设置了一个符号断点,但所有 可以收集相同的数据-在视图层次结构之外。

Xcode 11.1(11A1027)iOS 13.1.2

任何指导将不胜感激。

AddNewPatient视图:

导入SwiftUI 导入CoreData

struct AddNewPatient: View {

@Environment(\.managedObjectContext) var managedObjectContext
@Environment(\.presentationMode) var presentationMode

@State private var updatedTitle: String = "No Title"
@State private var updatedFirstName: String = "No First Name"
//more properties

@State var photos: [UIImage] = [UIImage]()
@State private var showImagePicker: Bool = false

var bImage: Image = Image("InventoryThinBlueWithCamera")

var body: some View {
    NavigationView {
        ScrollView {
        VStack {
            if photos.count > 0 {
                Image(uiImage: photos[photos.count - 1])
                    .resizable()
                    .frame(width: 320, height: 320)
                    .aspectRatio(contentMode: .fit)
                    .cornerRadius(12)
            } else {
                bImage
            }

            VStack {
            Button("Take Photo") {
                self.showImagePicker = true
            }
            .padding()
            .background(Color.green)
            .foregroundColor(.white)
            .cornerRadius(12)
            //.disabled(!showAlert)
            }
            .sheet(isPresented: self.$showImagePicker) {
                PhotoCaptureView(photos: self.$photos)
            }

            VStack(alignment: .leading) {
                Text("Patient Title:")
                    .padding(.leading, 5)
                    .font(.headline)
                TextField("Enter a Title", text: $updatedTitle)
                    .onAppear {
                        self.updatedTitle = ""
                }
                .textFieldStyle(RoundedBorderTextFieldStyle())
            }
            .padding(10)


            VStack(alignment: .leading) {
                Text("First Name:")
                    .padding(.leading, 5)
                    .font(.headline)
                TextField("Enter First Name", text: $updatedFirstName)
                    .onAppear {
                        self.updatedFirstName = ""
                }
                .textFieldStyle(RoundedBorderTextFieldStyle())
            }
            .padding(10)

            //bunch more fields



            Spacer()
        }
    }//ScrollView
    .navigationBarTitle("Add New Patient", displayMode: .inline)
    .padding(.top, 50)
    .navigationBarItems(trailing:  Button(action: ({

        let nmo = Patient(context: self.managedObjectContext)
        var chosenImageData : Data?

        if self.photos.count > 0 {
            let theImage = self.photos[self.photos.count - 1]

            let rir = CRSReduceImageResolution()
            let temp = rir.resizeMyImageData(theImage, startSize: CGSize.zero, endSize: CGSize(width: 320, height: 240))
            chosenImageData = temp
            //chosenImageData = myImageData
            nmo.image = chosenImageData
        }

        nmo.myID = UUID()
        nmo.title = self.updatedTitle
        nmo.firstName = self.updatedFirstName
        nmo.lastName = self.updatedLastName
        nmo.createdAt = Date()

        do {
            try self.managedObjectContext.save()
        } catch {
            print(error)
        }

        self.photos = []
                self.updatedTitle = ""
                self.updatedFirstName = ""
                //bunch more fields
            })) {
                Text("Save")
            })
    }//nav
}
}

1 个答案:

答案 0 :(得分:0)

我更改了跟踪按钮的调用,以切换属性以显示添加患者表,然后调用函数以添加患者。效果很好。

 .navigationBarTitle("Person")
 .sheet(isPresented: $showAddPatient) {
      AddNewPatient(photoStore: self.photoStore)
  }

  .navigationBarItems(
       leading: EditButton(),
       trailing: Button(
           action: {
               withAnimation { self.showAddPatient.toggle() }
           }
        ) {
          Image(systemName: "plus")
        }