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

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

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

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

Swift

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

Q&A

解決済

1回答

1859閲覧

UserDefaultsとapp delegate

hikarin

総合スコア24

Xcode

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

Swift

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

0グッド

0クリップ

投稿2016/11/24 15:26

ViewController1と2でボタンを押した回数分、ViewController3のラベルの数字が増えていくというものがあります。
ボタンを押した回数は保存したいです。

初めViewController1で押した回数をapp delegateを通ってViewController3に送り、押した回数を表示させます。
次にViewController2で押した回数をapp delegateを通ってViewController3に送り、1で押した回数との合計を表示させたいと思っています。
この時、値を保存するUserDefaultsはどのViewControllerに書けばいいのでしょうか。もちろんボタンを押すのは1だけもあれば2だけもありますし、1→2→1→2と何回も往復することもあります。

結構混乱しているため変な文章になっていたらすいません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

初めViewController1で押した回数をapp delegateを通ってViewController3に送り、押した回数を表示させます。

次にViewController2で押した回数をapp delegateを通ってViewController3に送り、1で押した回数との合計を表示させたいと思っています。

UserDefaultsを使用する場合app delegate経由で値を渡す必要はありません。

以下の様にすると各画面でボタンを押したものを合計してラベルに表示できます。

Storyboardの配置

イメージ説明

Code

swift

1import UIKit 2 3// ViewController1 4class ViewController1: UIViewController { 5 6 @IBAction func pushCountUpButton(_ sender: UIButton) { 7 8 var count = UserDefaults.standard.integer(forKey: "count") 9 count += 1 10 UserDefaults.standard.set(count, forKey: "count") 11 UserDefaults.standard.synchronize() 12 } 13} 14 15// ViewController2 16class ViewController2: UIViewController { 17 18 @IBAction func pushCountUpButton(_ sender: UIButton) { 19 20 var count = UserDefaults.standard.integer(forKey: "count") 21 count += 1 22 UserDefaults.standard.set(count, forKey: "count") 23 UserDefaults.standard.synchronize() 24 } 25} 26 27// ViewController3 28class ViewController3: UIViewController { 29 30 @IBOutlet weak var countLabel: UILabel! 31 32 override func viewDidLoad() { 33 super.viewDidLoad() 34 35 let count = UserDefaults.standard.integer(forKey: "count") 36 countLabel.text = "\(count)" 37 } 38}

★ おまけ

各画面に同じ処理を書くのが単調なのでどこかに処理をまとめるとスッキリします。
以下はUserDefaultsextensionとしてまとめました。

参考にしてみてください。

swift

1import UIKit 2 3class ViewController1: UIViewController { 4 5 @IBAction func pushCountUpButton(_ sender: UIButton) { 6 7 // 拡張したUserDefaultsメソッドを呼び出し 8 UserDefaults.standard.countUp() 9 } 10} 11 12class ViewController2: UIViewController { 13 14 @IBAction func pushCountUpButton(_ sender: UIButton) { 15 16 // 拡張したUserDefaultsメソッドを呼び出し 17 UserDefaults.standard.countUp() 18 } 19} 20 21class ViewController3: UIViewController { 22 23 @IBOutlet weak var countLabel: UILabel! 24 25 override func viewDidLoad() { 26 super.viewDidLoad() 27 28 // 拡張したUserDefaultsメソッドを呼び出し 29 countLabel.text = "\(UserDefaults.standard.getCount())" 30 } 31} 32 33 34// UserDefaultsを拡張 35extension UserDefaults { 36 37 // Keyを定義 38 var countKey: String { 39 return "count" 40 } 41 42 // CountをUpするメソッド 43 func countUp() { 44 var count = UserDefaults.standard.integer(forKey: self.countKey) 45 count += 1 46 UserDefaults.standard.set(count, forKey: self.countKey) 47 UserDefaults.standard.synchronize() 48 } 49 50 // 現在のCountを取得する 51 func getCount() -> Int { 52 return UserDefaults.standard.integer(forKey: self.countKey) 53 } 54 55 // Countをリセット 56 func resetCount() { 57 UserDefaults.standard.set(0, forKey: self.countKey) 58 UserDefaults.standard.synchronize() 59 } 60}

投稿2016/11/24 21:26

編集2016/11/24 22:15
_Kentarou

総合スコア8490

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

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

hikarin

2016/11/25 11:22

無事解決することができました。二つ同時に使っていたため色々混乱していたのかもしれません。 UserDefaultsはファイルに書き込むことで保存のみできると考えていたのですが、今回UserDefaultsを用いることで値渡しもできたというのはファイル経由で共通の値を使用し保存もしたということでしょうか。
_Kentarou

2016/11/25 22:59

UserDefaultsはシングルトンオブジェクトでどこからも同じ値を取得できます、値を保存はサンドボックス内にplistの形で保存しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問