SWIFTを勉強しはじめてから数ヶ月の、プログラミング初心者です。
初めてご質問させていただきます。
アプリの概要
配列やタグ、UserDefaultsの勉強用のアプリです。
【メイン画面のオブジェクト】 ・文字列の組み合わせを連結して表示するTextLabel ・「いぬ」というButton ・「ねこ」というButton ・「うさぎ」というButton ・「あひる」というButton ・「全て削除」というButton ・「保存」というButton ・「1つ削除」というButton 【保存画面のオブジェクト】 ・TableView ・保存した文字列の組み合わせ一覧を表示するTableViewCell
ボタンを押すたびにそれに応じた文字列がテキストラベルに連続して追加されます。
気に入った文字列の組み合わせを保存できます。
例えば、「いぬ」「ねこ」「うさぎ」という順にボタンを押すと、テキストラベルに以下のように表示されます。
いぬ、ねこ、うさぎ、
「保存」を押すとこの順番の組み合わせの文字列をそのままUserDefaultsで保存できます。
保存画面では保存した文字列のセットを一覧表示して、タップするとメイン画面のTextLabelに呼び出すことができます。
発生している問題
「全て削除」でTextLabelを全て削除することはできたのですが、「1つ削除」で最後に追加した文字列を消す方法が分かりません。
つまり、
いぬ、ねこ、うさぎ、
の状態で「1つ削除」すると、
いぬ、ねこ、
にしたいということです。
試したこと
・rangeメソッドで最後に追加した文字列を抽出しようとしましたが、「いぬ、うさぎ、いぬ」などのパターンの場合に最初の文字列までヒットしてしまいます。
・ボタンを押すたびにラベルに表示する文字列を配列に入れる仕組みにしてみましたが、そうするとUserDefaultsに保存するにあたり、配列の配列を作って保存するという状態になってしまいました。
現在のように、textLabel.textをそのまま配列animalArrayに追加していく仕組みで実装する方法はないものでしょうか?
該当のソースコード
Swift
1 2 3import UIKit 4 5class ViewController: UIViewController { 6 @IBOutlet weak var textLabel: UILabel! //表示用ラベル 7 let userDefaults = UserDefaults.standard //セット保存用UserDefaults 8 var animalArray: [String] = [] //セット保存用配列 9 10 @IBOutlet weak var btn1: UIButton! 11 @IBOutlet weak var btn2: UIButton! 12 @IBOutlet weak var btn3: UIButton! 13 @IBOutlet weak var btn4: UIButton! 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 } 18 19 //動物ボタンを押したときの処理 20 @IBAction func tapped(sender: UIButton) { 21 textLabel.numberOfLines = 0 //ラベルを自動改行 22 let btnNum:UIButton = sender 23 24 enum BtnTag:Int { 25 case btn1 = 1 26 case btn2 = 2 27 case btn3 = 3 28 } 29 switch btnNum.tag { 30 case 1: 31 self.textLabel.text = "(self.textLabel.text!)" + "いぬ、" 32 case 2: 33 self.textLabel.text = "(self.textLabel.text!)" + "ねこ、" 34 case 3: 35 self.textLabel.text = "(self.textLabel.text!)" + "うさぎ、" 36 case 4: 37 self.textLabel.text = "(self.textLabel.text!)" + "あひる、" 38 default: 39 break 40 } 41 } 42 43 //全て削除の処理 44 @IBAction func allClear(_ sender: Any) { 45 textLabel.text = "" //ラベルの文字を初期化 46 47 } 48 49 //保存の処理 50 @IBAction func saveSet(_ sender: Any) { 51 //キーの存在確認 52 if userDefaults.object(forKey: "setKey") != nil { //データの存在確認 53 animalArray = userDefaults.object(forKey: "setKey") as! [String] //あったら代入 54 } 55 //ラベルを配列に保存 56 animalArray.append(textLabel.text!) 57 //UserDefaultsに配列を保存 58 userDefaults.set(animalArray, forKey: "setKey") 59 } 60 61 //一つ削除の処理 62 @IBAction func beforeClear(_ sender: Any) { 63 64 } 65 66 67 @IBAction func setSegueAction(_ sender: Any) { 68 performSegue(withIdentifier: "setSegue", sender: nil) 69 } 70 71 72 override func viewDidAppear(_ animated: Bool) { 73 super.viewDidAppear(animated) 74 if userDefaults.object(forKey: "cellKey") != nil{ //キーcellKeyの存在確認 75 animalArray = userDefaults.array(forKey: "setKey") as! [String] 76 let cellNum = userDefaults.integer(forKey: "cellKey") 77 if cellNum >= animalArray.count { 78 return 79 } 80 textLabel.text = animalArray[cellNum] 81 } 82 } 83} 84 85 86
Swift
1 2import UIKit 3 4class SetViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 5 6 @IBOutlet weak var tableView: UITableView! 7 var animalArray: [String] = [] 8 let userDefaults = UserDefaults.standard 9 10 override func viewDidLoad() { 11 super.viewDidLoad() 12 tableView.delegate = self 13 tableView.dataSource = self 14 } 15 16 override func viewWillAppear(_ animated: Bool) { //毎回呼ばれる 17 if userDefaults.object(forKey: "setKey") != nil { 18 animalArray = userDefaults.object(forKey: "setKey") as! [String] 19 } 20 tableView.reloadData() 21 } 22 23 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 24 return animalArray.count 25 } 26 27 func numberOfSections(in tableView: UITableView) -> Int { 28 return 1 29 } 30 31 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 32 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 33 cell.textLabel!.text = animalArray[indexPath.row] 34 return cell 35 } 36 37 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 38 return 100 39 } 40 41 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 42 if editingStyle == UITableViewCell.EditingStyle.delete { 43 animalArray.remove(at: indexPath.row) 44 userDefaults.set(animalArray, forKey: "setKey") 45 tableView.reloadData() 46 } 47 } 48 49 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 50 let cellNum = indexPath.row 51 userDefaults.set(cellNum, forKey: "cellKey") 52 53 self.navigationController?.popViewController(animated: true) 54 } 55 56} 57
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。