見出し画像

SwiftUIでいこう! - 写真を読み出し、保存 1

CoreDataを使います。Xcode Version 12.4 を使って新規プロジェクトを作る時にCoreDataのチェックを入れて作成すると、サンプルのテンプレートが記述された状況で作成されます。

そのままRunしてもエラーが出てうまくいきません。SwiftUIについて詳しく説明してあるサイトを真似て作ってRunするとうまく起動します。

テンプレートのデータは起動した、ボタンを押したタイムスタンプが表示され削除も可能なので一通りの機能が揃った状態です。このテンプレートを利用して自分の入れたいデータ、使いたい動作に変更していくと簡単かもしれません。今回は以下

SwiftUI Tutorial : How i saved Images in CoreData + ImagePicker with SwiftUI in Xcode

を参考にコードを書いていきますので別ファイルを作ったり少し違った形にしていきます。

まず起動時の画面よりボタンを押して写真を選んで説明、名前を入れる画面に移ります。そこで入力を終わって、ボタンを押すことでデータを保存します。そして最初の画面に戻ると選んだ写真がリスト表示されているということになります。

必要な編集、作成ファイルはContentViewSenderViewImagePickerです。

ContentViewは最初からあるので、これを編集していきます。メインの画面で写真の表示、説明文、名前などを書いたリストを表示します。

SenderViewは新規作成して画像を選んで表示一時的に表示させ、説明文、名前をつけます。

SenderViewでの写真を選択する時に呼び出すものとしてImagePickerを新規で作りますiPhoneの写真アプリで管理されている写真を取り込めるようにします。

これらのファイルについて実装していきます。

まず最初に入っているデータベースでいうテーブルの定義から、CoreDataではEntitiesと言いますがこれを修正、追加していきます。Entitiesの名前は"Saving"としています。

descriptions ... String
favo ... Bool
imageD ... Binary Data
userName ... String

という感じに作っていきます。ファイルとしては拡張子

.xcdatamodeld

をクリックして作成画面を出して編集していきます。

ContentViewをこのデータにあったものに変更していきます。

@FetchRequest(
  entity: Saving.entity(),
  sortDescriptors: [
  NSSortDescriptor(keyPath: \Saving.userName, ascending: true)
  ],animation: .default
  )
private var savings: FetchedResults<Saving>

 NSSortDescriptorはとりあえず一つのデータを書いておけば良いみたいなので一つにしてきます。あとは"Saving"として定義したものを入れ込んでいきます。

CoreDataの部分は上記のように実装し、他の画面構成などのコードは参考動画と同じように実装すればうまくいきます。まず、

import SwiftUI
import CoreData

表示させるContentView,入力する部分SederViewを作ります。

ContentViewです。基本的にはNavigationViewとListで作っていきます。

NavigationView{
           List(){

  }
}

List表示で画像とコメントが付けられるようにします。Image()とText()を使います。

画像1

.navigationBarTitle("News", displayMode:.inline)
.navigationBarItems(trailing: Button(action:{
           self.show.toggle()
      }){
          Image(systemName: "camera.fill")
      })

画像2

こんな感じになります。

カメラマークのボタンを押すと

 .sheet(isPresented: self.$show){
     SenderView().environment(\.managedObjectContext,self.viewContext)
   }

が動いてSenderView()が表示されます。

この記事が気に入ったらサポートをしてみませんか?