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

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

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

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

Q&A

解決済

2回答

305閲覧

swiftのUserDefaults.standardにデータを保存する場合についてです。

Hayato1201

総合スコア220

Swift

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

0グッド

0クリップ

投稿2018/09/02 13:06

編集2018/09/02 13:11

UserDefaults.standardを使いリストを保存しようとしています。何のリストかと言うと、UIButtonを継承した独自クラスのリストなのですが、これがエラーになります。UserDefaults.standardは IntやStringと行った型しか保存できないのでしょうか?以下の様にしました。UIbuttonのリストを以下の様に保存したい場合は別の方法を試すしかないのでしょうか?

Swift

1 2var Buttons = [UIButton]()このリストを保存したい 3var Buttontitles = [String]() 4 5// UIButtonを継承した独自クラス 6class MyButton: UIButton{ 7 let x:Int 8 let y:Int 9 init(x:Int,y:Int,frame:CGRect){ 10 self.x = x 11 self.y = y 12 super.init(frame:frame) 13 } 14 required init(coder aDecoder: NSCoder) { 15 fatalError("init(coder:) has not been implemented") 16 } 17 } 18 19func create_buttons(button_name: String){ 20 21 Button_num += 1 22 if Button_num % 2 == 0{ 23 24 Button_num_row += 1 25 26 }else{ 27 Button_num_row = 0 28 Button_num_col += 1 29 } 30 31 32 var btn : UIButton = MyButton( 33 x:Button_num_row, 34 y:Button_num_col, 35 frame:CGRect(x:CGFloat(50+Button_num_row*150) ,y:CGFloat(Button_num_col)*100,width:100,height:50)) 36 37 btn.setTitle(button_name, for:UIControlState.normal) 38 //ボタンを押したときの動作 39 btn.addTarget(self,action:#selector(pushed),for: UIControlEvents.touchUpInside) 40 //見える用に赤くした 41 btn.backgroundColor = UIColor.red 42 43 btn.showsTouchWhenHighlighted = true 44 btn.layer.shadowOpacity = 0.5 45 Buttontitles.append((btn.currentTitle)!) 46 Buttons.append(btn) 47 //画面に追加 48 view.addSubview(btn) 49 50 //以下で保存しようとしています!!!! 51 let defaults = UserDefaults.standard 52 defaults.set(Buttons, forKey: "Buttons")//UIButton型が保存できない?因みにストリングのリストでdefaults.set(Buttontitles, forKey: "Buttons")だとできる 53 54 55 56 57 } 58 59

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんな感じで

swift

1import UIKit 2 3class DataConvertor { 4 5 let buttonArray: [UIButton] 6 let titleLabeLArray : [String] = ["abc", "def", "ghi", "jkl"] 7 8 let userDefaults = UserDefaults.standard 9 10 init() { 11 buttonArray = titleLabeLArray.map { title -> UIButton in 12 let button = UIButton() 13 button.setTitle(title, for: .normal) 14 return button 15 } 16 } 17 18 func set() { 19 let data = NSKeyedArchiver.archivedData(withRootObject: buttonArray) 20 userDefaults.set(data, forKey: "data") 21 userDefaults.synchronize() 22 } 23 24 func get() { 25 guard let data = userDefaults.object(forKey: "data") as? Data else { 26 fatalError() 27 } 28 guard let array = NSKeyedUnarchiver.unarchiveObject(with: data) as? [UIButton] else { 29 fatalError() 30 } 31 array.forEach{ button -> Void in 32 guard let text = button.titleLabel?.text else { 33 fatalError() 34 } 35 print(text) //abc 36 //def 37 //ghi 38 //jkl 39 } 40 } 41 42} 43 44

いけます。名前適当です。

本音を言うとこんなの面倒なので必要な値だけuserDefaultsに入れるのが無難です。

投稿2018/09/02 14:27

編集2018/09/02 14:32
xAxis

総合スコア1349

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

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

Hayato1201

2018/09/02 23:35

ありがとうございました!
guest

0

UserDefaultsにはUIButton型は保存できません。
確かにインターフェースはAny?型で保存できるように見えますが、取り出すときに利用する

swift

1func integer(forKey defaultName: String) -> Int

などのメソッドのセットには、 func uibutton(foKey defaultName: String) -> UIButton はありません。UserDefaultsには一般的にプリミティブな型と言われるようなIntやFloatやStringなど、そしてそれらの配列や辞書しか入れられないです。

今回の質問にあるUIButtonのリストを保存するという要望は、例えばUIButtonのタイトルのリストをStringの配列という形でUserDefaultsに保存しておき、取り出したときにそのStringの配列からUIButtonを再度生成するという形で実現できると思います。

投稿2018/09/02 14:28

kouheiszk

総合スコア213

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

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

Hayato1201

2018/09/02 23:35

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問