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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

645閲覧

UserDefaultsに保存した数字をLabelに表示する

hik_

総合スコア42

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2019/02/15 12:53

編集2019/02/17 02:26

前提・実現したいこと

TextFieldに入力された数字を別画面のLabelに表示する 事を実装してみたいのですが、
Labelに表示出来ても画面遷移をしてしまうと表示が消えてしまうので、UserDefaultsに保存して表示させたいです。

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

TextFieldに入力された数をUserDefautlsに保存する という所までは作れたのですが、
UserDfautlsに保存されたTextFieldの入力内容をどうやってLabelに表示するのかが分からない状況です。

override func prepareで解決しないかも調べている状況です。

該当のソースコード

import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } }
import UIKit // 変数 var date = [String]() class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.keyboardType = UIKeyboardType.numberPad } @IBAction func okButton(_ sender: Any) { date.append(textField.text!) UserDefaults.standard.set(date, forKey: "numberDate") } }

試したこと

UserDefaultsを調べていて、色々試している状況です。

import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() label.text = date //Cannot assign value of type '[String]' to type 'String?' } }

UserDefautlsの基本やLabelに表示させる方法を調べているのですが、まだ実装出来ていません。
ご教示頂けると幸いです。

追記 2/16

色々調べているとoverride func prepareとoverride func viewWillAppear(_ animated: Bool)
が使えるのではと思い以下のコードを書きましたが、エラーが起きている状況です。

import UIKit class ViewController: UIViewController { var date:String? var dateBox = [String]() @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } // ViewControllerを表示する度に処理 override func viewWillAppear(_ animated: Bool) { dateBox.append(date!) //Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value UserDefaults.standard.set(dateBox, forKey: "DateA") let defaults = UserDefaults.standard let set = defaults.string(forKey: "DateA") label.text = set } }
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.keyboardType = UIKeyboardType.numberPad } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "aSegue" { let ViewCon = segue.destination as! ViewController ViewCon.date = textField.text } } }

追記 2/16 ②

import UIKit class ViewController: UIViewController { var date:String = "" var dateBox = [String]() @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } // ViewControllerを表示する度に処理 override func viewWillAppear(_ animated: Bool) { dateBox.append(date) UserDefaults.standard.set(dateBox, forKey: "DateA") let defaults = UserDefaults.standard let set = defaults.string(forKey: "DateA") label.text = set } }
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() textField.keyboardType = UIKeyboardType.numberPad } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "aSegue" { let ViewCon = segue.destination as! ViewController ViewCon.date = textField.text // Value of optional type 'String?' must be unwrapped to a value of type 'String' } } }

2/17 解決

import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let _ = UserDefaults.standard.object(forKey: "text") as? String { label.text = (UserDefaults.standard.object(forKey: "text") as! String) } } }
import UIKit class SecondViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // textFieldの入力方法をナンバーパッドに設定 textField.keyboardType = UIKeyboardType.numberPad } @IBAction func okButton(_ sender: Any) { UserDefaults.standard.set(textField.text, forKey: "text") } }

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

Swift4 Xcode10

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー文である
「Fatal error: Unexpectedly found nil while unwrapping an Optional value」
をキーワードにGoogle検索すればどのような状況かはすぐわかるのではないでしょうか。

Optional型で宣言されているdate変数の中身がnilにも関わらず!を使ったことでエラーになっています。
提示いただいているコードを見てもdateに値を入れる処理がどこにもないようです。

本質的な解決ではないですが

Swift

1var date:String?

Swift

1var date:String = ""

と空文字を初期値として与えておけばエラーにはならないと思います。

投稿2019/02/15 17:30

nakasho_dev

総合スコア2655

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

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

hik_

2019/02/16 03:30

ご回答ありがとうございます。 var date:String = "" に修正したのですが、 ViewCon.date = textField.text // Value of optional type 'String?' must be unwrapped to a value of type 'String' とエラーが起きている状況です。 エラーとoptionalについて詳しく調べている状況です。 質問内にコードを追記しています。 ご教示頂けると幸いです。 宜しくお願いします。
nakasho_dev

2019/02/16 13:18

textField.textはOptional型(String?)なのでStringに直接代入できません。dateをString?にするかtextField.textをnilチェックしたうえで代入するかの対応が必要です。
hik_

2019/02/17 02:27

ご返信ありがとうございます。 解決方法を模索していたら、実装出来ました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問