回答編集履歴

1

変更案

2020/09/03 09:16

投稿

TsukubaDepot
TsukubaDepot

スコア5086

test CHANGED
@@ -31,3 +31,215 @@
31
31
 
32
32
 
33
33
  最終的に実現したいことがいまいち把握できていないのですが、セルをタップしてアラートを出した後、最終的にどのような状態にしたいのかもう少し明確にしていただければ、解決法が出るかもしれません。
34
+
35
+
36
+
37
+ ##修正案(追記)
38
+
39
+
40
+
41
+ `awakeFromNib()`でセル背景の色を設定しても、それは xib を登録する時にしか呼び出されないと思いますので、tableView でセルを生成する時に色を変更してはどうでしょうか。
42
+
43
+
44
+
45
+ 条件には書かれていませんが、スクリーンショットから、**画面遷移は Navigation Controller で行っている**と仮定します。
46
+
47
+
48
+
49
+ たとえば、
50
+
51
+ ```Swift
52
+
53
+ // StickyCell.swift
54
+
55
+ import UIKit
56
+
57
+
58
+
59
+ class StickyCell: UITableViewCell {
60
+
61
+ @IBOutlet weak var stickyBubble: UIView!
62
+
63
+ @IBOutlet weak var label: UILabel!
64
+
65
+
66
+
67
+ override func awakeFromNib() {
68
+
69
+ super.awakeFromNib()
70
+
71
+ }
72
+
73
+
74
+
75
+ override func setSelected(_ selected: Bool, animated: Bool) {
76
+
77
+ super.setSelected(selected, animated: animated)
78
+
79
+ }
80
+
81
+ }
82
+
83
+ ```
84
+
85
+
86
+
87
+ とし、
88
+
89
+ ```Swift
90
+
91
+ // SettingTableViewController.swift
92
+
93
+ import UIKit
94
+
95
+
96
+
97
+ class SettingTableViewController: UITableViewController {
98
+
99
+
100
+
101
+ let defaults = UserDefaults.standard
102
+
103
+
104
+
105
+ override func viewDidLoad() {
106
+
107
+ super.viewDidLoad()
108
+
109
+ }
110
+
111
+
112
+
113
+ // 中略
114
+
115
+ override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
116
+
117
+ let alert: UIAlertController = UIAlertController(title: "セルカラー", message: "", preferredStyle: .actionSheet)
118
+
119
+
120
+
121
+ let defaultAction1: UIAlertAction = UIAlertAction(title: "オレンジ", style: UIAlertAction.Style.default, handler:{
122
+
123
+ (action: UIAlertAction!) -> Void in
124
+
125
+ self.defaults.set(.orange, forKey: "CellColor")
126
+
127
+ })
128
+
129
+
130
+
131
+ let defaultAction2: UIAlertAction = UIAlertAction(title: "グリーン", style: UIAlertAction.Style.default, handler:{
132
+
133
+ (action: UIAlertAction!) -> Void in
134
+
135
+ self.defaults.set(.green, forKey: "CellColor")
136
+
137
+ })
138
+
139
+
140
+
141
+ alert.addAction(defaultAction1)
142
+
143
+ alert.addAction(defaultAction2)
144
+
145
+
146
+
147
+ present(alert, animated: true, completion: nil)
148
+
149
+ }
150
+
151
+ // 後略
152
+
153
+ }
154
+
155
+ ```
156
+
157
+
158
+
159
+ のように、UIAlert で色変更する部分も UserDefaults に保存するだけにします。
160
+
161
+
162
+
163
+ ViewController では、
164
+
165
+
166
+
167
+ ```Swift
168
+
169
+ // ViewController.swift
170
+
171
+ import UIKit
172
+
173
+ import GrowingTextView
174
+
175
+
176
+
177
+ class ViewController: UIViewController, UITableViewDelegate {
178
+
179
+ // 中略
180
+
181
+ // セル背景色
182
+
183
+ var cellColor: UIColor?
184
+
185
+
186
+
187
+ // 追加
188
+
189
+ // ビューが表示される直前に UserDefaults から色を読み込み、変数にセットし、セルをリロードする
190
+
191
+ override func viewWillAppear(_ animated: Bool) {
192
+
193
+ super.viewWillAppear(animated)
194
+
195
+
196
+
197
+ cellColor = defaults.color(forKey: "CellColor")
198
+
199
+ tableView.reloadData()
200
+
201
+ }
202
+
203
+ // 中略
204
+
205
+ }
206
+
207
+ extension ViewController: UITableViewDataSource{
208
+
209
+ // 中略
210
+
211
+ func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
212
+
213
+ let cell = tableView.dequeueReusableCell(withIdentifier: "ReusableCell", for: indexPath) as! StickyCell
214
+
215
+ cell.label.text = itemArray[indexPath.row].text
216
+
217
+ // 追加
218
+
219
+ // セルを表示する時に背景色をセットする
220
+
221
+ cell.stickyBubble.backgroundColor = cellColor
222
+
223
+ return cell
224
+
225
+ }
226
+
227
+ }
228
+
229
+ ```
230
+
231
+
232
+
233
+ コメントにもあるように、`ViewWillAppear(_:)` でセルの背景色を読み込み、`tableView(_:cellForRowAt:)`でセルを生成する時に背景色をセットします。
234
+
235
+
236
+
237
+ こんな感じかと思います。
238
+
239
+
240
+
241
+ 注意しなければいけないのは、iOS13 以降の設定で、かつもしNavigationController を使わずに画面遷移し、表示が Pop Over だった場合には、元の画面に戻った時に`ViewWillAppear(_:)`が呼び出されません。
242
+
243
+
244
+
245
+ なので、そのような場合には Full Screen で遷移させるか、あるいは適切な関連記事を読んでいただいて、元の画面に戻ったときの処理を設定していただければと思います。