swift
1note.content = noteContentxtFieTextView.text ?? ""
2note.content = Note1.text ?? ""
3note.content = Note2.text ?? ""
ここで note.content
に noteContentxtFieTextView.text
を入れてそれを Note1.text
で上書きしてさらに Note2.text
で上書きしているからでは?
同様にviewWillAppearでも1つのインスタンスに対して上書きし続けているようですが、別のインスタンスに分けるとか、配列にするとか、クラスにするとかしないといけないと思います。
プロパティと同名の変数が出てきたりしてコードが非常に読みづらいのと、実際の保存処理のところが提示されていないのでなんとも言えないところではありますが。
追記 Jul 16, 2020 11:00 AM
「データの管理をする」と「データを画面に表示する」の2つの処理について、役割を分けたほうがよいです。
リスト表示画面 (NotesTableViewController) で生成した Note のインスタンスを詳細表示・編集画面 (DisplayNoteViewController) に渡したり、あるいは施した編集作業をリストに反映させるために詳細表示・編集画面からリスト表示画面に渡したり、というのはコードの見通しが良くないです。
下記はシングルトンを使ってデータの管理をするクラス (StoredNotesManager) を実装する例です。実際に動かしてはいませんので適宜調整が必要だとは思いますが、参考になればと思います。
swift
1class Note {
2 var title: String = ""
3 var content: String = ""
4 var memo1: String = ""
5 var memo2: String = ""
6}
7
8class StoredNotesManager {
9 static let shared = StoredNotesManager()
10 private var storedNotes: [Note] = []
11 private init() {
12 // FIXME: 永続化済みのデータがあればここで storedNotes に格納する
13 }
14
15 var count: Int {
16 get { return self.storedNotes.count }
17 }
18
19 func append(_ appendingNote: Note) -> Void {
20 self.storedNotes.append(appendingNote)
21 self.persistence()
22 }
23
24 func remove(at: Int) -> Void {
25 self.storedNotes.remove(at: at)
26 self.persistence()
27 }
28
29 func update(at: Int, newNote: Note) -> Void {
30 self.storedNotes[at] = newNote
31 self.persistence()
32 }
33
34 func get(at: Int) -> Note? {
35 if self.storedNotes.count <= at { return nil }
36 return self.storedNotes[at]
37 }
38
39 /// 永続化
40 private func persistence() {
41 // FIXME: 永続化処理を実装する
42 }
43}
swift
1// MARK: - 永続化済みの Notes を一覧表示する
2class NotesTableViewController: UITableViewController {
3 override func viewDidLoad() {
4 super.viewDidLoad()
5 }
6
7 // 表示すべきセルの数を返す
8 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
9 return StoredNotesManager.shared.count
10 }
11
12 // テーブルの特定の行に対して、表示すべきcellを返す
13 // indexPathは、作成するcellがデーブルビュー内のどのセクションと行に属するかを示す
14 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
15 //テーブルビューに表示される実際のcellをフェッチしている
16 //ダウンキャスト <- NotesTableViewCellがUITableViewCellのサブクラスであるため機能する
17 //コンパイラに具体的な種類のUITableViewCellを返すことを指示する
18 let cell = tableView.dequeueReusableCell(withIdentifier: "notesTableViewCell", for: indexPath) as! NotesTableViewCell
19
20 // indexPathは、cellForRowに渡された引数であり、テーブルビューがセルをどの行に表示するのかを示す
21 // indexPathのrowプロパティにアクセスし、検索する。
22 cell.noteTitleLabel.text = StoredNotesManager.shared.get(at: indexPath.row)?.title ?? ""
23
24 return cell
25 }
26
27 // commitEditingStyle : forRowAt indexPath: により、テーブルビューに追加の編集モードを有効にする
28 // cellを左スワイプした際に削除オプションが表示される
29 override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
30 // editingStyleが.deleteであるかどうかを調べる
31 if editingStyle == .delete {
32 // notesPathから渡されたindexPathのrowプロパティを使用して、選択されたノートをnotes配列から削除する
33 StoredNotesManager.shared.remove(at: indexPath.row)
34 }
35 }
36
37 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
38 if let identifier = segue.identifier {
39 if identifier == "displayNote" {
40 print("Table view cell tapped")
41
42 // すべてのテーブルビューは、indexPathForSelecedRowというプロパティを持っている。
43 // ユーザーがテーブルビューからcellを選択した場合、特定のcellのindexPathにアクセス可能
44 // indexPathにはsection,rowのプロパティがあり、選択したテーブルビューのcellをマッピングする
45 // データモデル(ここではnotes配列)に関連付けることができる。
46 let indexPath = tableView.indexPathForSelectedRow!
47 (segue.destination as! DisplayNoteViewController).storedAt = indexPath.row
48 } else if identifier == "addNote" {
49 print("+ button tapped")
50 (segue.destination as! DisplayNoteViewController).isNewNote = true
51 }
52 }
53 }
54
55 @IBAction func unwindToNotesViewController(_ segue: UIStoryboardSegue) {
56
57 }
58}
59
60// MARK: - Note の詳細表示・編集
61class DisplayNoteViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UITextFieldDelegate {
62 @IBOutlet weak var noteTitleTextField: UITextField!
63 @IBOutlet weak var noteContentxtFieTextView: UITextView!
64 @IBOutlet weak var memo1TextView: UITextView!
65 @IBOutlet weak var memo2TextView: UITextView!
66
67 var storedAt: Int = 0
68 var isNewNote: Bool = false
69
70 override func viewDidLoad() {
71 super.viewDidLoad()
72 }
73
74 override func viewWillAppear(_ animated: Bool){
75 super.viewWillAppear(animated)
76
77 // 新規作成の場合は空文字を入れる
78 if self.isNewNote {
79 self.noteTitleTextField.text = ""
80 noteContentxtFieTextView.text = ""
81 memo1TextView.text = ""
82 memo2TextView.text = ""
83 return
84 }
85
86 // 既存の Note の詳細表示・編集の場合は、永続化済みの Note から値を取得する
87 let note: Note? = StoredNotesManager.shared.get(at: self.storedAt)
88 self.noteTitleTextField.text = note?.title
89 self.noteContentxtFieTextView.text = note?.content
90 self.memo1TextView.text = note?.memo1
91 self.memo2TextView.text = note?.memo2
92 }
93
94 override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
95 if segue.identifier != "save" { return }
96 let newNote: Note = Note()
97 newNote.title = self.noteTitleTextField.text ?? ""
98 newNote.content = self.noteContentxtFieTextView.text
99 newNote.memo1 = self.memo1TextView.text
100 newNote.memo2 = self.memo2TextView.text
101
102 if isNewNote {
103 StoredNotesManager.shared.append(newNote)
104 return
105 }
106
107 StoredNotesManager.shared.update(at: self.storedAt, newNote: newNote)
108 }
109}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/10 21:15
2020/07/10 21:33
2020/07/10 22:25
2020/07/11 06:34
2020/07/15 22:53
2020/07/16 01:03
2020/07/16 01:06