Why does this works perfectly fine on iPhone but crashes on ipad
import SwiftUI
import MessageUI
struct ContactDetailView: View {
let contact: ContactEntity
@EnvironmentObject var vm: CoreDataViewModel
@State private var showCompanyConnection = false
@State private var showJobConnection = false
@State private var showingAddJobScreen = false
@State private var currentSelectedJob: Int = 0
@State var result: Result<MFMailComposeResult, Error>?
@State var msgBody: String?
@State private var isShowingMailView = false
var body: some View {
VStack {
ContactHeaderComponent(firstName: contact.firstName ?? "", lastName: contact.lastName ?? "")
.frame(height: 50)
NavigationLink {
ContactDetailView(contact: contact)
} label: {
Text(contact.company?.companyName ?? "")
.font(.callout)
.foregroundColor(.secondary)
}
Spacer()
List {
// MARK: Contact Information
Section {
HStack {
Image(systemName: "phone")
Spacer()
if (contact.phoneNumber != "") || (contact.phoneNumber != nil) {
let numberString = contact.phoneNumber!
Button {
let telephone = "tel://"
let formattedString = telephone + numberString
guard let url = URL(string: formattedString) else { return }
UIApplication.shared.open(url)
} label: {
Text(numberString)
}
} else {
Text("")
}
}
HStack {
Image(systemName: "envelope")
Spacer()
Button {
isShowingMailView.toggle()
} label: {
Text(contact.emailAdress ?? "")
}
}
}
// MARK: Add Job
Section(header: Text(StringConstants.addJobs)) {
Toggle(StringConstants.addConnectionJobC, isOn: $showJobConnection)
if showJobConnection {
HStack {
Picker(selection: $currentSelectedJob, label: Text(StringConstants.selectedJobc)) {
ForEach(0 ..< vm.jobs.count, id: \.self) {
Text(LocalizedStringKey((self.vm.jobs[$0].jobTitle ?? "") + " at " + (self.vm.jobs[$0].company?.companyName ?? "")))
}
}
}
Button {
showingAddJobScreen.toggle()
} label: {
Label(StringConstants.addNewJobC, systemImage: "plus.circle")
}
Button {
if vm.contacts.firstIndex(of: contact) != nil {
vm.addJobToContact(contactIndex: vm.contacts.firstIndex(of: contact)!, jobIndex: currentSelectedJob)
}
showJobConnection.toggle()
} label: {
Text(StringConstants.saveConnection)
}
}
}
// MARK: Exisiting Jobs
Section(header: Text(StringConstants.jobsC)) {
if let jobs = contact.jobs?.allObjects as? [JobEntity] {
ForEach(jobs) { job in
NavigationLink {
JobDetailView(job: job)
} label: {
VStack(alignment: .leading) {
Text(job.jobTitle ?? "")
Text(StringConstants.status + ": " + (job.status ?? ""))
.font(.caption)
}
}
}
}
}
}
}
.toolbar(content: {
ToolbarItem(placement: .navigationBarTrailing) {
NavigationLink {
if vm.contacts.firstIndex(of: contact) != nil {
ContactDetailEditView(contactIndex: vm.contacts.firstIndex(of: contact)!, model: contact)
.environmentObject(vm)
}
} label: {
Text(StringConstants.edit)
}
}
})
.sheet(isPresented: $showingAddJobScreen) {
AddJobView()
}
.sheet(isPresented: $isShowingMailView) {
MailView(result: self.$result, recipients: contact.emailAdress ?? "")
}
}
}
ERROR: Thread 1: Fatal error: No ObservableObject of type CoreDataViewModel found. A View.environmentObject(_:) for CoreDataViewModel may be missing as an ancestor of this view.
On vm in (all the way down)
if vm.contacts.firstIndex(of: contact) != nil {
ContactDetailEditView(contactIndex: vm.contacts.firstIndex(of: contact)!, model: contact)
.environmentObject(vm)
}
I have to mention that the direct parent view on iPhone is a navigationView, on iPad it isn't (it uses a sie bar and on the grand-parent)