我最初设计了一个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
}
}
答案 0 :(得分:0)
我更改了跟踪按钮的调用,以切换属性以显示添加患者表,然后调用函数以添加患者。效果很好。
.navigationBarTitle("Person")
.sheet(isPresented: $showAddPatient) {
AddNewPatient(photoStore: self.photoStore)
}
.navigationBarItems(
leading: EditButton(),
trailing: Button(
action: {
withAnimation { self.showAddPatient.toggle() }
}
) {
Image(systemName: "plus")
}