質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

SwiftUIとCoreData使用中にFatal error: Environment<NSManagedObjectContext> has no key-pathエラーが発生

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 371

score 18

SwiftUIにてCoreDataを使用しています。
なんの問題もなく使用できていたのですが、突然タイトルに有るエラーが発生しました。
FetchRequestでKeyPathは指定しています。
エラーはAppDelegateにて発生しています。

可能性として考えられる原因をご教授いただければと思います。
よろしくお願いいたします。

import UIKit
import CoreData


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate { //ここにエラーが引いてあります

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


        return true
    }



    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {

        return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
    }

    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
       application:didFinishLaunchingWithOptions.

    }



       lazy var persistentContainer: NSPersistentContainer = {

           let container = NSPersistentContainer(name: "coredata")
           container.loadPersistentStores(completionHandler: { (storeDescription, error) in
               if let error = error as NSError? {



                   fatalError("Unresolved error \(error), \(error.userInfo)")
               }
           })
           return container
       }()



       func saveContext () {
           let context = persistentContainer.viewContext
           if context.hasChanges {
               do {
                   try context.save()
               } catch {
                  function in a shipping application, although it may be useful during development.
                   let nserror = error as NSError
                   fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
               }
           }
       }



}

アプリ操作上、実際にエラーが出るのは以下のViewです。

import SwiftUI
import CoreData

struct BtNameView:View {

    @State var nameOfBt:String

    var body: some View{
        HStack{
            Text("\(nameOfBt)").frame(width: UIScreen.screenWidth/5)
            Divider()
        }
    }
}


struct DayDetailView: View {

    @Environment(\.managedObjectContext) var managedObjectContext

    @FetchRequest(
        entity: BtList.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath:\BtList.saveDate,ascending:true)],
        predicate: NSPredicate(format:"isComplete == %@ " ,NSNumber(value:false))
    )
    var DayDetailLists:FetchedResults<BtList>

    @Binding var doneBtDate:String

    var dateFormatter:DateFormatter{
        let formatter = DateFormatter()
        formatter.setLocalizedDateFormatFromTemplate("yMMMMdEEEE")

        return formatter
    }

    var saveDateFormatter:DateFormatter{
        let saveFormatter = DateFormatter()
        saveFormatter.setLocalizedDateFormatFromTemplate("yMMMMd")

        return saveFormatter
    }

    @State var btDictionary:[String:[String]] = [
        "BUN":[],
      // 一部略
    ]


    @State var btListBool = false
    @State var showBtListButtonBool = true

    @State var photoImage:Data = UIImage(imageLiteralResourceName: "grey-icon").pngData()!
    @State var photoTitle:String = ""

    var imageWidth = UIScreen.main.bounds.width*4/10
    var imageheight = UIScreen.main.bounds.width*4/10*4/3

    @State var zoomAppear = false


    var body: some View {

        VStack{
            padding()
            Text("\(self.doneBtDate)").font(.caption).foregroundColor(.gGreen)
            Divider()
//            Text("画像一覧").font(.title)
            ScrollView(.horizontal,showsIndicators: false){
                HStack{
                    ForEach(DayDetailLists){photolist in
                        if (self.dateFormatter.string(from:photolist.saveDate ?? Date()) == self.doneBtDate && photolist.imageData != nil){
                            ZStack{

                                Image(uiImage:UIImage(data:photolist.imageData ?? self.photoImage)!)
                                    .resizable()
                                    .frame(width:self.imageWidth,height:self.imageheight )
                                    .cornerRadius(6)
                                    .onTapGesture {
                                        self.photoImage = photolist.imageData ?? self.photoImage
                                        self.photoTitle = photolist.phototitle ?? ""
                                        self.zoomAppear.toggle()

                                }
                                .sheet(isPresented: self.$zoomAppear){ PhotoZoomView(zoomPhotoImage:self.$photoImage,zoomPhotoTitle: self.$photoTitle)
                                }

                                    Text("\(photolist.phototitle ?? "")").foregroundColor(.white)

                            }//ZStack
                        }//if
                    }//ForEach
                }//HStack
            }//ScrolView

            if(self.btListBool == false && self.showBtListButtonBool == false){
                           Divider()
                           Button(action:{
                               self.btListBool = true
                           }){
                               Text("血液検査項目を開く")
                           }
                           Spacer()
                       }


            List{
                Section(header:Text("メモ")){
                    ForEach(DayDetailLists){messagelist in
                        if(self.dateFormatter.string(from:messagelist.saveDate ?? Date()) == self.doneBtDate && messagelist.message != nil){
                            Text("\(messagelist.message ?? "error")")
                        }
                    }
                }//Section
            }//List


            //            Divider()



            if(self.showBtListButtonBool){
                Divider()
                Button(action:{
                    for list in self.DayDetailLists{
                        print("\(self.dateFormatter.string(from:list.saveDate ?? Date()))")
                        print("\(self.doneBtDate)")
                        if self.dateFormatter.string(from:list.saveDate ?? Date()) == self.doneBtDate{
                            print("date success")
                            if let bun = list.bun{
                                self.btDictionary["BUN"]?.append("\(bun)")
                            }else{
                                print("bun is Empty")
                            }
                           //一部略


                            self.btListBool = true
                            self.showBtListButtonBool = false
                        }//if
                        else{
                            print("date error")
                        }
                    }//for in
                }){
                    Text("血液検査結果を見る")
                }
                Spacer()
            }//if



            if(self.btListBool){
                VStack{
                    Divider()
                    Button(action:{
                        self.btListBool = false
                    }){Text("血液検査項目を閉じる")}
                    Form{

                        Group{

                            if self.btDictionary["BUN"]?.isEmpty ?? false{}
                            else{
                                BtDayListView(btDayListDictionary: self.btDictionary["BUN"] ?? ["error"], btDayListSection: "BUN", btDayListUnits: BtListView().kidneyUnits["BUN"] ?? "error")
                            }//else

                           //一部略

                        }//Group

                    }//form



                }//VStack

            }//if

        }//VStack
    }//body
}//View

struct BtDayListView:View{

   //略
}




コード
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る