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

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

新規登録して質問してみよう
ただいま回答率
85.50%
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回答

1834閲覧

UserDefaultsに保存した値を計算

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/03/01 03:51

編集2019/03/07 10:47

前提・実現したいこと

TextFieldに入力した数字をLabelに加算していく事を作りたく、(1回目TextFieldに100を入力→Labelに100表示、2回目TextFieldに100入力→Labelに1回目の100に2回目の100を足した数、合計200をLabelに表示)
合計をLabelに表示する段階は作れたのですが、アプリを再起動しても消えないようにUserDefaultsを使い保存したく作っているのですが、再起動したらLabelにしっかり再起動前の数字がしっかりと表示されたいるのですが、addViewControllerに移動しTextFieldに数字を入力したら、LabelにはUserDefaultsで保存されていた数字に足したいのですが、リセットされていて再起動後のTextFieldに入力された数字だけの表示になってしまいます。

イメージ説明

該当のソースコード

import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let _ = UserDefaults.standard.object(forKey: "textKey") as? String { label.text = (UserDefaults.standard.object(forKey: "textKey") as! String) } } }
import UIKit var aText:Int = 0 class addViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // textFieldの入力方法をナンバーパッドに設定 textField.keyboardType = UIKeyboardType.numberPad } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) } } @IBAction func addButton(_ sender: Any) { let textB = Int(textField.text!) aText = aText + textB! UserDefaults.standard.set(String(aText), forKey: "textKey") } }

試したこと

UserDefaultsの基本的な部分などを調べているのですが、改善できていません。
現段階では、addViewControllerを表示した時にUserDefaultsの存在確認を行えば良いのではないかと考え、以下のコードを書いたのですが、解決していない状況です。
ご教示頂ければ幸いです。宜しくお願いします。

import UIKit var aText:Int = 0 class addViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // textFieldの入力方法をナンバーパッドに設定 textField.keyboardType = UIKeyboardType.numberPad } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if let _ = UserDefaults.standard.object(forKey: "textKey") as? Int { aText = (UserDefaults.standard.object(forKey: "textKey") as! Int) } } @IBAction func addButton(_ sender: Any) { let textB = Int(textField.text!) aText = aText + textB! UserDefaults.standard.set(String(aText), forKey: "textKey") } }

3/7日 解決

以下のコードで解決に至りました。ありがとうございます。

import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } // ViewControllerを開く度に中の処理が呼ばれる override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // UserDefaultsに保存された数字が無いか確認する if let _ = UserDefaults.standard.object(forKey: "textKey") as? String { // UserDefaultsに保存されたaTextの値をlabelに表示する label.text = (UserDefaults.standard.object(forKey: "textKey") as! String) // アプリ再起動後もaddViewControllerで引き続き計算出来るように、labelに表示されている値をUserDefaultsにtext2Keyとして保存する。 UserDefaults.standard.set(Int(label.text!), forKey: "text2Key") } } }
import UIKit // 初期値を0に設定した変数aTextを作成 var aText:Int = 0 class addViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // textFieldの入力方法をナンバーパッドに設定 textField.keyboardType = UIKeyboardType.numberPad } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // addViewControllerを開く度にViewControllerのviewDidAppearでUserDefaultsで保存したlabelの値がある場合は、aTextに反映させてaddButton内で引き続き計算出来る様にする。 if let _ = UserDefaults.standard.object(forKey: "text2Key") as? Int { aText = (UserDefaults.standard.object(forKey: "text2Key") as! Int) } } @IBAction func addButton(_ sender: Any) { // iBにtextFieldに入力された数字を入れる guard let iB = Int(textField.text!) else { return } // aTextにiBの数字を入れて、aTextに入れる。 aText = aText + iB // UserDefaultsにaTextの値をtextKeyで保存する UserDefaults.standard.set(String(aText), forKey: "textKey") } }

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

Swift4 Xcode10

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

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

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

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

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

t_obara

2019/03/01 04:50

再起動した時にaTextの内容をご確認してみてはいかがでしょうか。
hik_

2019/03/01 07:46 編集

ありがとうございます。ViewControllerのviewDidAppearにprint(aText)と書いてシミュレーターを動かしたのですが、TextFieldに入力する度にLabelと同じく加算された数字がコンソールに表示されていくのですが、アプリを再起動するとコンソールに何も表示されなくなり、TextFieldに数字を入力してもコンソールに表示されない状態です。 宜しくお願いします。
t_obara

2019/03/01 10:04

それがわかったのであれば、その点を改善すれば良いと思うのですが。
hik_

2019/03/01 10:15

ご返信ありがとうございます。 デバッグで分かった情報を元に調べて取り組んでみます。 ありがとうございます。
vanderlvov

2019/03/07 16:13

解決方法を回答にして、自己解決にした方がいいかもしれません。
hik_

2019/03/08 13:01

解決方法を回答して自己解決にしました。ありがとうございます。
guest

回答1

0

自己解決

以下のコードで解決に至りました。ありがとうございました。

import UIKit class ViewController: UIViewController { @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() } // ViewControllerを開く度に中の処理が呼ばれる override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // UserDefaultsに保存された数字が無いか確認する if let _ = UserDefaults.standard.object(forKey: "textKey") as? String { // UserDefaultsに保存されたaTextの値をlabelに表示する label.text = (UserDefaults.standard.object(forKey: "textKey") as! String) // アプリ再起動後もaddViewControllerで引き続き計算出来るように、labelに表示されている値をUserDefaultsにtext2Keyとして保存する。 UserDefaults.standard.set(Int(label.text!), forKey: "text2Key") } } }
import UIKit // 初期値を0に設定した変数aTextを作成 var aText:Int = 0 class addViewController: UIViewController { @IBOutlet weak var textField: UITextField! override func viewDidLoad() { super.viewDidLoad() // textFieldの入力方法をナンバーパッドに設定 textField.keyboardType = UIKeyboardType.numberPad } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) // addViewControllerを開く度にViewControllerのviewDidAppearでUserDefaultsで保存したlabelの値がある場合は、aTextに反映させてaddButton内で引き続き計算出来る様にする。 if let _ = UserDefaults.standard.object(forKey: "text2Key") as? Int { aText = (UserDefaults.standard.object(forKey: "text2Key") as! Int) } } @IBAction func addButton(_ sender: Any) { // iBにtextFieldに入力された数字を入れる guard let iB = Int(textField.text!) else { return } // aTextにiBの数字を入れて、aTextに入れる。 aText = aText + iB // UserDefaultsにaTextの値をtextKeyで保存する UserDefaults.standard.set(String(aText), forKey: "textKey") } }

投稿2019/03/08 13:00

hik_

総合スコア42

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問