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

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

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

1609閲覧

テキストラベルに最後に追加した文字列だけ削除したい

catcat

総合スコア11

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/04/29 15:42

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

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
最後に追加した文字列の抽出方法がわからなかったため、ボタンを押すたびにテキストラベルの文字列を配列に入れることで、removeLastで文字列をひとつ削除することにしました。

投稿2019/05/01 00:41

catcat

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問