#質問したいこと
今メモ帳アプリを作成中です。
うまくいい表すことができないのですが、ホーム画面からcellをタップして詳細画面にいき詳細画面で文章を編集して保存するとcellが新たに増えてしまっています。(写真を下の方に掲示しています。)
#コード
swift
1//ホーム画面 2import UIKit 3 4class ViewController: UIViewController,UITableViewDataSource,UITableViewDelegate { 5 6 @IBOutlet weak var memoTableView: UITableView! 7 8 var memoArray = [String]() 9 10 let ud = UserDefaults.standard 11 12 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 13 return memoArray.count 14 } 15 16 17 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 18 let cell = tableView.dequeueReusableCell(withIdentifier: "memoCell", for: indexPath) 19 cell.textLabel?.text = memoArray[indexPath.row] 20 return cell 21 } 22 23 func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 24 self.performSegue(withIdentifier: "toDetail", sender: nil) 25 //押したら押した状態を解除 26 tableView.deselectRow(at: indexPath, animated: true) 27 } 28 29 30 override func viewDidLoad() { 31 super.viewDidLoad() 32 33 memoTableView.delegate = self 34 memoTableView.dataSource = self 35 } 36 override func viewWillAppear(_ animated: Bool) { 37 loadMemo() 38 } 39 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 40 //destinationのクラッシュ防ぐ 41 if segue.identifier == "toDetail"{ 42 //detailViewControllerを取得 43 //as! DetailViewControllerでダウンキャストしている 44 let detailViewController = segue.destination as! DetailViewController 45 //遷移前に選ばれているCellが取得できる 46 let selectedIndexPath = memoTableView.indexPathForSelectedRow! 47 detailViewController.selectedMemo = memoArray[selectedIndexPath.row] 48 detailViewController.selectedRow = selectedIndexPath.row 49 } 50 } 51 func loadMemo(){ 52 if ud.array(forKey: "memoArray") != nil{ 53 //取得 またas!でアンラップしているのでnilじゃない時のみ 54 memoArray = ud.array(forKey: "memoArray") as![String] 55 //reloadしてくれる 56 memoTableView.reloadData() 57 } 58 } 59 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { 60 61 if editingStyle == .delete { 62 63 //resultArray内のindexPathのrow番目をremove(消去)する 64 memoArray.remove(at: indexPath.row) 65 66 //再びアプリ内に消去した配列を保存 67 ud.set(memoArray, forKey: "memoArray") 68 69 //tableViewを更新 70 tableView.reloadData() 71 } 72 } 73} 74
swift
1//詳細画面 2 3import UIKit 4 5class DetailViewController: UIViewController { 6 7 @IBOutlet weak var memoTextView: UITextView! 8 9 var selectedRow:Int! 10 var selectedMemo : String! 11 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 memoTextView.text = selectedMemo 15 let kbToolBar = UIToolbar(frame: CGRect(x: 0, y: 0, width: 320, height: 40)) 16 kbToolBar.barStyle = UIBarStyle.default // スタイルを設定 17 kbToolBar.sizeToFit() // 画面幅に合わせてサイズを変更 18 // スペーサー 19 let spacer = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.flexibleSpace, target: self, action: nil) 20 // 閉じるボタン 21 let commitButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonItem.SystemItem.done, target: self, action: #selector(self.commitButtonTapped)) 22 kbToolBar.items = [spacer, commitButton] 23 memoTextView.inputAccessoryView = kbToolBar 24 } 25 26 @objc func commitButtonTapped() { 27 self.view.endEditing(true) 28 } 29 30 //画面遷移する時にタップするボタン 31 @IBAction func save(_ sender: Any) { 32 33 let inputText = memoTextView.text 34 let ud = UserDefaults.standard 35 if ud.array(forKey: "memoArray") != nil{ 36 //saveMemoArrayに取得 37 var saveMemoArray = ud.array(forKey: "memoArray") as! [String] 38 //テキストに何か書かれているか? 39 if inputText != ""{ 40 //配列に追加 41 saveMemoArray.append(inputText!) 42 ud.set(saveMemoArray, forKey: "memoArray") 43 }else{ 44 showAlert(title: "何も入力されていません") 45 46 } 47 48 }else{ 49 //最初、何も書かれていない場合 50 var newMemoArray = [String]() 51 //nilを強制アンラップはエラーが出るから 52 if inputText != ""{ 53 //inputtextはoptional型だから強制アンラップ 54 newMemoArray.append(inputText!) 55 ud.set(newMemoArray, forKey: "memoArray") 56 }else{ 57 showAlert(title: "何も入力されていません") 58 } 59 } 60 showAlert(title: "保存完了") 61 ud.synchronize() 62 } 63 64 func showAlert(title:String){ 65 let alert = UIAlertController(title: title, message: nil, preferredStyle: .alert) 66 67 alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 68 69 alert.addAction(UIAlertAction(title: "キャンセル", style: .cancel, handler: nil)) 70 71 self.present(alert, animated: true, completion:nil) 72 } 73 //削除ボタン 74 @IBAction func deleteMemo(_ sender: Any) { 75 let ud = UserDefaults.standard 76 if ud.array(forKey: "memoArray") != nil{ 77 var saveMemoArray = ud.array(forKey: "memoArray") as![String] 78 saveMemoArray.remove(at: selectedRow) 79 ud.set(saveMemoArray, forKey: "memoArray" ) 80 ud.synchronize() 81 //画面遷移 82 self.navigationController?.popViewController(animated: true) 83 } 84 } 85 86 //シェアボタン 87 @IBAction func showActivityView(_ sender: UIBarButtonItem) { 88 let activitycontroller = UIActivityViewController(activityItems: [memoTextView], applicationActivities: nil) 89 90 self.present(activitycontroller, animated: true, completion: nil) 91 } 92 93} 94
語彙力なくて本当にすみません。
少し急いでいます。よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/23 06:19
退会済みユーザー
2019/11/23 07:13 編集