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

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

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

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

Q&A

解決済

1回答

287閲覧

動的に配置したボタンをUserDefaults.standardに保存し、それを消したりしたいです。

Hayato1201

総合スコア220

Swift

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

0グッド

0クリップ

投稿2018/09/03 13:08

編集2018/09/03 13:09

以下の様にまずボタンを作成&配置するメソッドを作ります。以下全てクラスはVCの中です。

swift

1var Buttontitles = [String]() 2 //保存用 3 let defaults = UserDefaults.standard 4 5 //ボタン系 6 var Button_num = 0 7 var Button_num_row = 0 8 var Button_num_col = 0 9 10// UIButtonを継承した独自クラス 11 class MyButton: UIButton{ 12 let x:Int 13 let y:Int 14 init(x:Int,y:Int,frame:CGRect){ 15 self.x = x 16 self.y = y 17 super.init(frame:frame) 18 } 19 required init(coder aDecoder: NSCoder) { 20 fatalError("init(coder:) has not been implemented") 21 } 22 } 23 24func create_buttons(button_name: String, first:Bool){ 25 26 27 Button_num += 1 28 if Button_num % 2 == 0{ 29 30 Button_num_row += 1 31 32 }else{ 33 Button_num_row = 0 34 Button_num_col += 1 35 } 36 37 var btn : UIButton = MyButton( 38 x:Button_num_row, 39 y:Button_num_col, 40 frame:CGRect(x:CGFloat(50+Button_num_row*150) ,y:CGFloat(Button_num_col)*100,width:100,height:50)) 41 42 btn.setTitle(button_name, for:UIControlState.normal) 43 //ボタンを押したときの動作 44 btn.addTarget(self,action:#selector(pushed),for: UIControlEvents.touchUpInside) 45 46 btn.backgroundColor = UIColor.red 47 btn.tag = Button_num 48 49 50 51 52 53 if first { 54 Buttontitles.append((btn.currentTitle)!) 55 defaults.set(Buttontitles, forKey: "Buttontitles") 56 57 } 58 //画面に追加 59 view.addSubview(btn) 60 61 } 62 63 override func viewDidLoad() { 64 super.viewDidLoad() 65 66 let loadedButtonList = defaults.object(forKey: "Buttontitles") 67 if (loadedButtonList as? [String] != nil) { 68 Buttontitles = loadedButtonList as! [String] 69 for btn in Buttontitles{ 70 create_buttons(button_name: btn,first: false)//引数のfirstは二重で名前を登録してしまわない様に設定。 71 } 72 } 73 74 } 75

以上の様にUserDefaults.standardにボタンの名前のリストを登録しておいて再度アプリが起動した際はそれを引数にボタンを再配置しています。ここまでは出来ています。次にこれらをデリートするメソッドを作りました。

swift

1 func button_delete(index: Int) { 2 Button_num = 0 3 Buttontitles.remove(at: index) 4 defaults.set(Buttontitles, forKey: "Buttontitles") 5 loadView() 6 viewDidLoad() 7 8 }

これでindexで指定したボタンをButtontitlesから消し、その状態で再描画すれば単純にそこだけが消えて再描画されると思ったのですが、再描画される位置が変です。例えば3個ボタンが配置されていて1個目を消したとします。すると4個目が配置される場所から2個目3個目と表示されてしまいます。button_deleteが実行されてからButton_num = 0としているので最初の位置から描画されると思ったのですがなぜそうならないのでしょうか?因みに一度アプリを閉じてから開くと理想通りの位置にきます。またこの様な機能を実装する際もっと他に良い方法はあるでしょうか?

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

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

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

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

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

guest

回答1

0

自己解決

単純にrow col = 0のし忘れでした。

投稿2018/09/03 15:27

Hayato1201

総合スコア220

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問