@@ -22,6 +22,8 @@ class ListViewController<T: TableViewCellViewModel>: BaseUITableViewController {
22
22
var dataSource : EditableDataSource < Section , T > ?
23
23
private let viewModel : ListViewModel
24
24
private lazy var emptyListMessage = EmptyListMessage ( message: viewModel. emptyListMessage)
25
+ private var firstTimeLoading = true
26
+ private var lastSelectedCellViewModel : T ?
25
27
26
28
init ( viewModel: ListViewModel ) {
27
29
self . viewModel = viewModel
@@ -60,23 +62,22 @@ class ListViewController<T: TableViewCellViewModel>: BaseUITableViewController {
60
62
snapshot. appendItems ( cells. compactMap ( { $0 as? T } ) )
61
63
dataSource? . apply ( snapshot, animatingDifferences: false ) { [ weak self] in
62
64
if snapshot. numberOfItems == 0 {
63
- self ? . header. isHidden = true
64
- self ? . tableView. backgroundView = self ? . emptyListMessage
65
- // Prevents `EmptyListMessage` from being placed under the navigation bar
66
- self ? . tableView. contentInsetAdjustmentBehavior = . never
67
- self ? . tableView. separatorStyle = . none
65
+ self ? . hideHeaderAndShowEmptyListMessage ( )
68
66
} else {
69
67
self ? . header. isHidden = false
70
68
self ? . tableView. backgroundView = nil
71
69
self ? . tableView. separatorStyle = . singleLine
72
70
self ? . tableView. contentInsetAdjustmentBehavior = . automatic
71
+ self ? . restoreSelection ( )
73
72
}
73
+ self ? . firstTimeLoading = false
74
74
}
75
75
}
76
76
77
77
override func setEditing( _ editing: Bool , animated: Bool ) {
78
78
super. setEditing ( editing, animated: animated)
79
79
header. isEditing = editing
80
+ restoreSelection ( )
80
81
}
81
82
82
83
@objc func editButtonToggled( ) {
@@ -126,6 +127,10 @@ class ListViewController<T: TableViewCellViewModel>: BaseUITableViewController {
126
127
return configuration
127
128
}
128
129
130
+ override func tableView( _ tableView: UITableView , didSelectRowAt indexPath: IndexPath ) {
131
+ lastSelectedCellViewModel = dataSource? . itemIdentifier ( for: indexPath)
132
+ }
133
+
129
134
// MARK: - Internal
130
135
131
136
func removeRow( at indexPath: IndexPath ) throws {
@@ -166,4 +171,31 @@ class ListViewController<T: TableViewCellViewModel>: BaseUITableViewController {
166
171
// no-op
167
172
}
168
173
}
174
+
175
+ func hideHeaderAndShowEmptyListMessage( ) {
176
+ hideHeaderAndShowEmptyListMessage ( animated: !firstTimeLoading)
177
+ }
178
+
179
+ func hideHeaderAndShowEmptyListMessage( animated: Bool ) {
180
+ if animated {
181
+ hideHeaderAnimated ( ) . then ( showEmptyListMessageAnimated)
182
+ } else {
183
+ header. isHidden = true
184
+ tableView. backgroundView = emptyListMessage
185
+ // Prevents `EmptyListMessage` from being placed under the navigation bar
186
+ tableView. contentInsetAdjustmentBehavior = . never
187
+ tableView. separatorStyle = . none
188
+ }
189
+ }
190
+
191
+ private func restoreSelection( ) {
192
+ guard let splitViewController = splitViewController, !splitViewController. isCollapsed else {
193
+ return
194
+ }
195
+ let snapshot = dataSource? . snapshot ( )
196
+ let maybeLastSelectedCellViewModel = snapshot? . itemIdentifiers. first ( where: { $0. hashValue == lastSelectedCellViewModel? . hashValue } )
197
+ if let lastSelectedCellViewModel = maybeLastSelectedCellViewModel, let lastSelectedIndexPath = dataSource? . indexPath ( for: lastSelectedCellViewModel) {
198
+ tableView. selectRow ( at: lastSelectedIndexPath, animated: true , scrollPosition: . none)
199
+ }
200
+ }
169
201
}
0 commit comments