前提・実現したいこと
学習のためメモ帳アプリを作っていて、メモを作成して作成したメモをUserDefaultsで保存をする所まで作れたのですが、
メモを作成したCellをタップして文字を編集すると、編集後のテキストがあるCellだけで良いのですが、編集前のCellと編集後のCellの2つが作成されてしまう(例 「お菓子を買う」 というCellをタップして、TextViewに「お菓子を食べる」と書き直して保存を押すと、「お菓子を買う」だったCellが「お菓子を食べる」に変われば良いのですが、Cell1個目が「お菓子を買う」,Cell2個目に編集後の「お菓子を食べる」と2つ作成されてしまいます。)
該当のソースコード
import UIKit // memoTextFieldに入力された文字を格納する変数 var memoText = [String]() class ViewController: UIViewController { // 変数を作成 var aDate: String = "" @IBOutlet weak var memoTextView: UITextView! override func viewDidLoad() { super.viewDidLoad() // memoTextViewにaDateを入れる memoTextView.text = aDate } @IBAction func setButton(_ sender: Any) { // memoTextにmemoTextViewに入力された文字を格納 memoText.append(memoTextView.text!) // memoTextをUserDefaultsに保存 UserDefaults.standard.set(memoText, forKey: "memoTextKey") } }
import UIKit class TableViewController: UITableViewController { // 変数 var honMemo: String = "" override func viewDidLoad() { super.viewDidLoad() if UserDefaults.standard.object(forKey: "memoTextKey") != nil { memoText = UserDefaults.standard.object(forKey: "memoTextKey") as! [String] } } override func viewDidAppear(_ animated: Bool) { // TableViewを開く度にtableViewを更新する tableView.reloadData() } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // memoTextの数だけCell作成 return memoText.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Cellの表示内容を設定 let Cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) Cell.textLabel!.text = memoText[indexPath.row] return Cell } // Cellを押した時の処理 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { honMemo = memoText[indexPath.item] performSegue(withIdentifier: "Segue", sender: nil) } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { // 削除機能 let index = indexPath.row memoText.remove(at: index) // 削除した事を保存 UserDefaults.standard.set(memoText, forKey: "memoTextKey") // tableViewを再読み込み tableView.reloadData() } // ViewControllerへの引き継ぎ設定 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let vc = segue.destination as! ViewController vc.aDate = honMemo } }
import UIKit class TableViewCell: UITableViewCell { override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(_ selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } }
追記 3月21日
現状のコードです。
ご教示頂けると幸いです。
import UIKit // memoTextFieldに入力された文字を格納する変数 var memoText = [String]() // 再編集の場合の記事番号、-1なら新規作成 var honIndex = -1 var honRow: Int = honIndex class ViewController: UIViewController { // 変数を作成 var aDate: String = "" @IBOutlet weak var memoTextView: UITextView! override func viewDidLoad() { super.viewDidLoad() // memoTextViewにaDateを入れる memoTextView.text = aDate } @IBAction func setButton(_ sender: Any) { if honRow == honIndex { memoText.append(memoTextView.text!) } else { memoText[honRow] = memoTextView.text! } honRow = honIndex // memoTextにmemoTextViewに入力された文字を格納 memoText.append(memoTextView.text!) // memoTextをUserDefaultsに保存 UserDefaults.standard.set(memoText, forKey: "memoTextKey") } }
import UIKit class TableViewController: UITableViewController { // 変数 var honMemo: String = "" override func viewDidLoad() { super.viewDidLoad() if UserDefaults.standard.object(forKey: "memoTextKey") != nil { memoText = UserDefaults.standard.object(forKey: "memoTextKey") as! [String] } } override func viewDidAppear(_ animated: Bool) { // TableViewを開く度にtableViewを更新する tableView.reloadData() } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // memoTextの数だけCell作成 return memoText.count } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Cellの表示内容を設定 let Cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) Cell.textLabel!.text = memoText[indexPath.row] return Cell } // Cellを押した時の処理 override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { honMemo = memoText[indexPath.item] performSegue(withIdentifier: "Segue", sender: nil) } override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { // 削除機能 let index = indexPath.row memoText.remove(at: index) // 削除した事を保存 UserDefaults.standard.set(memoText, forKey: "memoTextKey") // tableViewを再読み込み tableView.reloadData() } // ViewControllerへの引き継ぎ設定 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let vc = segue.destination as! ViewController vc.aDate = honMemo } }
試したこと
現在TableViewCellなど解決出来そうな情報を探しているのですが、実装出来ていない状況です。
ご教示頂けると幸いです。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Swift4 XCode10
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/21 11:36 編集
2019/03/21 12:12
2019/03/22 10:20