SwiftUI Просмотр иерархии предупреждений в одном случае, а не в другом - PullRequest
0 голосов
/ 05 октября 2019

Я изначально создал приложение SwiftUI со списком / подробностями, которое включало TabView с одной вкладкой в ​​качестве представления для добавления новых записей. Это работает в значительной степени, как ожидалось. Я хотел изменить эту функцию добавления на вкладке, которая вызывается с помощью кнопки панели навигации. Я использую одно и то же представление в обоих случаях. Когда представление вызывается из кнопки навигационной панели, я получаю ошибку иерархии tableView:

[TableView] Только предупреждение один раз: UITableView было приказано расположить его видимые ячейки и другое содержимое, не находясь в иерархии представления (табличное представление или одно из его суперпредставлений не было добавлено в окно) .... + много больше болтовни

Вызов 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:

import SwiftUI import 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 голосов
/ 23 октября 2019

Я изменил вызов завершающей кнопки, чтобы переключить свойство для отображения листа добавления пациента, затем вызвал функцию для добавления пациента. Это прекрасно работает.

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

  .navigationBarItems(
       leading: EditButton(),
       trailing: Button(
           action: {
               withAnimation { self.showAddPatient.toggle() }
           }
        ) {
          Image(systemName: "plus")
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...