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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Swift

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

Q&A

解決済

1回答

403閲覧

UIImageをUserdefaultに保存したい

KaoruYoshida

総合スコア36

Swift

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

0グッド

0クリップ

投稿2022/09/05 16:19

編集2022/09/06 09:30

前提

こちらのサイトを参考にUIImageを@AppStorageを用いてUserDefaultに保存する機能を作っています。
https://keicon.hatenablog.com/entry/2021/05/10/191718

実現したいこと

  • UIImageをUserdefaultに保存したい

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

以下のソースコードの指定の部分に次のようなエラーコードが出てきます。

Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

どのようにすればbindImageがnilにならないか、工夫があれば教えていただけたら嬉しいです。

該当のソースコード

FirstViewからSettingViewにnavigation遷移をしています。

FirstView

1import SwiftUI 2import UIKit 3 4struct FirstView: View { 5 6  @AppStorage("IntegerKey") var day = "" 7  @AppStorage("launchedName") var bindName = "Name" 8  @AppStorage("launchedImage") var bindImage: Data? 9 10  var body: some View { 11   NavigationView{ 12    if let uiimage = UIImage(data: bindImage!) { //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value 13 Image(uiImage: uiimage) 14 } else { 15 Image("") 16 } 17 .toolbar{ 18 ToolbarItemGroup(placement: .navigationBarTrailing) { 19 NavigationLink(destination: SettingView(bindName: $bindName, bindImage: $bindImage)) { 20 Label("Setting", systemImage: "gearshape") 21 } 22 } 23 } 24 } 25} 26}

SettingView

1import SwiftUI 2 3struct SettingView: View { 4  @State private var name:String = "" 5  @State var onSwitch = false 6  @Binding var bindName: String 7  @Binding var bindImage: Data? 8 9  var body: some View { 10   if (self.name.isEmpty){ 11 Button(action: { 12 13 }) { 14 Text("confirm") 15 .font(.title2) 16 .padding(16) 17 .foregroundColor(Color.white) 18 .cornerRadius(10) 19 }.disabled(self.name.isEmpty) 20 } else { 21 Button(action: { 22 bindName = name 23 bindImage = profile_image.pngData() 24 UserDefaults.standard.set(self.bindName, forKey: "launchedName") 25 UserDefaults.standard.set(self.bindImage, forKey: "launchedImage") 26 self.onSwitch.toggle() 27 self.presentationMode.wrappedValue.dismiss() 28 }) { 29 Text("confirm") 30 } 31  } 32 } 33}

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

macOS バージョン12.3.1
2.6 GHz 6コアIntel Core i7
Xcodeバージョン13.3.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

Optional Chaining — The Swift Programming Language (Swift 5.7)

「,」で区切ってオプショナルを順番にアンラップすると良いと思いました。

swift

1if let image = bindImage, 2 let uiimage = UIImage(data: image) { 3 Image(uiImage: uiimage) 4}

SettingViewの中でUserDefaultsに保存するコード(launchedName,launchedImage)が2行ありますが、
@Bindingの元に@AppStorageがついていますので
2行のコードがなくても自動的に保存されると思いました。


SettingViewの
self.presentationMode
が定義されていないためビルドエラーになるようで、
ちゃんと再現確認できていないのですが、
そのあたりも含めての質問でしょうか?

投稿2022/09/06 00:30

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問