🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1927閲覧

Swift CoreData データを消した後にエラー

North_Hack

総合スコア0

Core Data

Core DataはAppleのOS X and iOSのためのオブジェクトモデリングと持続性を持ったフレームワークです。Xcodeはエンティティー、属性そして関係性を特定するためのオブジェクトモデルの編集機能を提供します。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2021/03/24 11:44

前提・実現したいこと

Swiftを独学で勉強していて、エラーメッセージから原因を探るのに苦戦しています。
Todoアプリ的なものを作っていまして、最後に終わったタスクを一覧で表示させて、次の画面に移る時にそのタスクのデータを全て消したいと考えています。
終わったタスクを消すこと自体は出来ているのですが、以下のエラーが出てアプリが強制終了します。
これはViewで表示させようとしているものが空だから出てるエラーなのでしょうか
初心者の拙い質問ですみません、ご教授いただけると幸いです。

やってみたこと
ForEach文の前にif文でデータがある時のみ表示

if !myItems.isEmpty{    ForEach(myItems, id: .id) { addToList in... }

発生している問題・エラーメッセージ

index 1 beyond bounds for empty NSArray"

該当のソースコード

import SwiftUI import CoreData struct ResultView: View { @Environment(.managedObjectContext) private var viewContext @EnvironmentObject var timeManager: TimeManager @FetchRequest( sortDescriptors: [NSSortDescriptor(keyPath: \ListItems.rowOrder, ascending: true)], animation: .default) private var myItems: FetchedResults<ListItems> @State var isShowSecondView = false @State var isShowResultView = false @State var isShowContentView = false var body: some View { ZStack{ ZStack{ Color(red: 1, green: 1, blue: 1) .edgesIgnoringSafeArea(.vertical) VStack{ Button(action: { self.isShowSecondView = false self.isShowResultView = false self.isShowContentView = true self.clearTask() }) { Image(systemName: "play") .font(.system(size: 100)) .padding(.init(top:20, leading: 50, bottom: 20, trailing: 50)) .background(Color.gray) .cornerRadius(30) } List { ForEach(myItems, id: .id) { addToList in HStack{ Text("(addToList.itemName ?? "Unknown")") Spacer() Text("(addToList.minResultTime):(addToList.secResultTime):(addToList.comResultTime)") } } .font(.system(size: 20)) } } } if isShowContentView { ContentView() } } } private func clearTask() { for entity in myItems{ if entity.resultTime > 0{ viewContext.delete(entity) saveData() } } } private func saveData() { try? self.viewContext.save() } } struct ResultView_Previews: PreviewProvider { static var previews: some View { ResultView().environment(.managedObjectContext, PersistenceController.preview.container.viewContext) .environmentObject(TimeManager()) } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2021/03/25 03:03

そのコードを動かしてみましたが、落ちませんね…。
North_Hack

2021/03/25 03:16

検証していただきありがとうございます。 落ちないですか、問題は他のコードにあるということになりますね。 ん〜もう少し視野を広げて試してみます。 ありがとうございます。助かりました。
North_Hack

2021/03/25 03:24

あ、今他のページに当たるコードを変えてみたら出来ました。 どうやらNavigationViewを使わず、各ページをZStackで上に上に表示させていく方法を使っていたので、前のページに当たるコードでエラーが出てしまっていました。 検証していただきありがとうございました。
guest

回答1

0

自己解決

上記の質問への返信に解決方法を記載させていただきました。
ありがとうございました。

投稿2021/03/25 03:32

North_Hack

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問