
前提
SwiftUIで以下のような明細欄を作っています。
商品 | 列2 | 列3 |
---|---|---|
鉛筆 | A | B |
消しゴム | C | D |
りんご | E | F |
ノート | G | H |
商品,列2,列3以外はTextFieldです。
こちらの記事を参考に、
明細欄の商品列のデータ(鉛筆, ...ノート)を保存したいのですが、保存できませんでした。
CoreData
ENTITIES : DetailTable
Attributes : detailList(Binary Data)
カスタムクラス
Detail.swift
1import Foundation 2 3// Detail(明細)クラス定義 4class Detail: NSObject, NSCoding { 5 var ID = UUID() 6 var productName = "" 7 8 init(productName: String?) { 9 self.productName = productName! 10 } 11 12 func encode(with aCoder: NSCoder) { 13 aCoder.encode(self.productName, forKey: "productName") 14 } 15 16 required init?(coder aDecoder: NSCoder) { 17 self.productName = aDecoder.decodeObject(forKey: "productName") as! String 18 } 19}
データの保存
CreateView.swift
1struct CreateView: View { 2 @Environment(\.managedObjectContext) private var viewContext 3 @State var detailField = ["", ""] 4 ... 5 var body: some View { 6 ... 7 } 8// 保存ボタン押下時の処理 9 private func createEstimate() { 10 let detail = DetailTable(context: viewContext) 11 12// 明細情報の保存 13 let detailFields = detailField // 配列[鉛筆, 消しゴム, りんご, ノート] 14 @State var detailList = [] 15 for i in 0..<detailFields.count { 16 let detail = Detail(productName: detailFields[i]) 17 detailList.append(detail) 18 } 19 do { 20 let detailListData: Data = try NSKeyedArchiver.archivedData(withRootObject: detailList, requiringSecureCoding: false) as Data 21 22 detail.detailList = detailListData 23 24 } catch let error { 25 print(error.localizedDescription) 26 } 27 28 // 生成したインスタンスをCoreDataに保存する 29 do { 30 try viewContext.save() 31 print("保存成功") 32 } catch { 33 let nsError = error as NSError 34 fatalError("Unresolved error \(nsError), \(nsError.userInfo)") 35 } 36 37 presentation.wrappedValue.dismiss() 38 } 39}
実現したいこと
・カスタムクラスへデータを保存したいです。
発生している問題・エラーメッセージ
エラーメッセージはありません。
該当のソースコード
CreateView.swift
1// 保存ボタン押下時の処理 2 private func createEstimate() { 3 let detail = DetailTable(context: viewContext) 4 5// 明細情報の保存 6 let detailFields = detailField // 配列[鉛筆, 消しゴム, りんご, ノート] 7 @State var detailList = [] 8 for i in 0..<detailFields.count { 9 let detail = Detail(productName: detailFields[i]) 10 detailList.append(detail) 11 }
試したこと
print()を使い、値が出力されているか試しました。
- 配列detailListには値が追加されていませんでした。
- 配列detailFieldsには値が追加されていました。
- detailにも値は入っていました。しかし、以下のような同じ値でした。
detail結果
<ProjectName.Detail: 0x600000ec46f0>
<ProjectName.Detail: 0x600000e63210>
<ProjectName.Detail: 0x600000e63210>
<ProjectName.Detail: 0x600000e63210>
補足情報(FW/ツールのバージョンなど)
macOS Monterey バージョン 12.3
Swift version 5.6.1
Xcode バージョン 13.4.1
たくさん調べたのですが解決できませんでした。
お力添えいただけますととても嬉しく思います。
よろしくお願いいたします。



回答1件
あなたの回答
tips
プレビュー