Skip to content

Commit d75c0c7

Browse files
committed
Fixed issue where a cell with nested editor in focus may get recycled
1 parent 486b674 commit d75c0c7

File tree

2 files changed

+10
-10
lines changed

2 files changed

+10
-10
lines changed

Diff for: Proton/Sources/Swift/Table/TableCell.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public class TableCell {
5454
/// Returns `true` if the cell has one or more retain invocations.
5555
@MainActor
5656
public var isRetained: Bool {
57-
retainCount > 0
57+
retainCount > 0 || containsFirstResponder
5858
}
5959

6060
/// Additional attributes that can be stored on Cell to identify various aspects like Header, Numbered etc.

Diff for: Proton/Sources/Swift/Table/TableView.swift

+9-9
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,7 @@ public class TableView: UIView {
416416

417417
var cellsInViewport: [TableCell] = [] {
418418
didSet {
419-
reclaimReleasedCells()
419+
reclaimReleasedCells(cellsInViewport)
420420

421421
guard oldValue != cellsInViewport else { return }
422422

@@ -496,13 +496,15 @@ public class TableView: UIView {
496496
.intersects(adjustedViewport) }
497497
}
498498

499-
private func reclaimReleasedCells() {
500-
retainedCells.forEach {
501-
if $0.isRetained == false {
502-
self.repository.enqueue(cell: $0)
503-
retainedCells.remove($0)
499+
private func reclaimReleasedCells(_ cellsInViewport: [TableCell]) {
500+
retainedCells
501+
.filter { cellsInViewport.contains($0) == false }
502+
.forEach {
503+
if $0.isRetained == false {
504+
self.repository.enqueue(cell: $0)
505+
retainedCells.remove($0)
506+
}
504507
}
505-
}
506508
}
507509

508510
func cellBelow(_ cell: TableCell) -> TableCell? {
@@ -870,13 +872,11 @@ extension TableView: TableContentViewDelegate {
870872
}
871873

872874
func tableContentView(_ tableContentView: TableContentView, didReceiveFocusAt range: NSRange, in cell: TableCell) {
873-
cell.retain()
874875
resetColumnResizingHandles(selectedCell: cell)
875876
delegate?.tableView(self, didReceiveFocusAt: range, in: cell)
876877
}
877878

878879
func tableContentView(_ tableContentView: TableContentView, didLoseFocusFrom range: NSRange, in cell: TableCell) {
879-
cell.release()
880880
removeSelectionBorders()
881881
delegate?.tableView(self, didLoseFocusFrom: range, in: cell)
882882
}

0 commit comments

Comments
 (0)