iOS: KeyValueCell should hold the observation token

And should nil the token when preparing for reuse.

Otherwise, the observation closure is still active even after the cell
gets reused.

Signed-off-by: Roopesh Chander <roop@roopc.net>
This commit is contained in:
Roopesh Chander 2019-02-03 12:27:51 +05:30
parent ca61e09536
commit cbc602245e
2 changed files with 4 additions and 2 deletions

View File

@ -71,6 +71,8 @@ class KeyValueCell: UITableViewCell {
var onValueChanged: ((String) -> Void)? var onValueChanged: ((String) -> Void)?
var onValueBeingEdited: ((String) -> Void)? var onValueBeingEdited: ((String) -> Void)?
var observationToken: AnyObject?
private var textFieldValueOnBeginEditing: String = "" private var textFieldValueOnBeginEditing: String = ""
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
@ -187,6 +189,7 @@ class KeyValueCell: UITableViewCell {
keyboardType = .default keyboardType = .default
onValueChanged = nil onValueChanged = nil
onValueBeingEdited = nil onValueBeingEdited = nil
observationToken = nil
key = "" key = ""
value = "" value = ""
configureForContentSize() configureForContentSize()

View File

@ -33,7 +33,6 @@ class TunnelDetailTableViewController: UITableViewController {
private var peerFieldIsVisible = [[Bool]]() private var peerFieldIsVisible = [[Bool]]()
private weak var statusCell: SwitchCell? private weak var statusCell: SwitchCell?
private var onDemandStatusObservationToken: AnyObject?
private var statusObservationToken: AnyObject? private var statusObservationToken: AnyObject?
private var reloadRuntimeConfigurationTimer: Timer? private var reloadRuntimeConfigurationTimer: Timer?
@ -352,7 +351,7 @@ extension TunnelDetailTableViewController {
let cell: KeyValueCell = tableView.dequeueReusableCell(for: indexPath) let cell: KeyValueCell = tableView.dequeueReusableCell(for: indexPath)
cell.key = tr("tunnelOnDemandKey") cell.key = tr("tunnelOnDemandKey")
cell.value = TunnelViewModel.activateOnDemandDetailText(for: tunnel.activateOnDemandSetting) cell.value = TunnelViewModel.activateOnDemandDetailText(for: tunnel.activateOnDemandSetting)
onDemandStatusObservationToken = tunnel.observe(\.isActivateOnDemandEnabled) { [weak cell] tunnel, _ in cell.observationToken = tunnel.observe(\.isActivateOnDemandEnabled) { [weak cell] tunnel, _ in
cell?.value = TunnelViewModel.activateOnDemandDetailText(for: tunnel.activateOnDemandSetting) cell?.value = TunnelViewModel.activateOnDemandDetailText(for: tunnel.activateOnDemandSetting)
} }
return cell return cell