From cbc602245e567c9635a60747b6eddf3713102829 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Sun, 3 Feb 2019 12:27:51 +0530 Subject: [PATCH] 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 --- WireGuard/WireGuard/UI/iOS/View/KeyValueCell.swift | 3 +++ .../iOS/ViewController/TunnelDetailTableViewController.swift | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/WireGuard/WireGuard/UI/iOS/View/KeyValueCell.swift b/WireGuard/WireGuard/UI/iOS/View/KeyValueCell.swift index c77cab9..61b2f2d 100644 --- a/WireGuard/WireGuard/UI/iOS/View/KeyValueCell.swift +++ b/WireGuard/WireGuard/UI/iOS/View/KeyValueCell.swift @@ -71,6 +71,8 @@ class KeyValueCell: UITableViewCell { var onValueChanged: ((String) -> Void)? var onValueBeingEdited: ((String) -> Void)? + var observationToken: AnyObject? + private var textFieldValueOnBeginEditing: String = "" override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { @@ -187,6 +189,7 @@ class KeyValueCell: UITableViewCell { keyboardType = .default onValueChanged = nil onValueBeingEdited = nil + observationToken = nil key = "" value = "" configureForContentSize() diff --git a/WireGuard/WireGuard/UI/iOS/ViewController/TunnelDetailTableViewController.swift b/WireGuard/WireGuard/UI/iOS/ViewController/TunnelDetailTableViewController.swift index beb5d24..3e80d94 100644 --- a/WireGuard/WireGuard/UI/iOS/ViewController/TunnelDetailTableViewController.swift +++ b/WireGuard/WireGuard/UI/iOS/ViewController/TunnelDetailTableViewController.swift @@ -33,7 +33,6 @@ class TunnelDetailTableViewController: UITableViewController { private var peerFieldIsVisible = [[Bool]]() private weak var statusCell: SwitchCell? - private var onDemandStatusObservationToken: AnyObject? private var statusObservationToken: AnyObject? private var reloadRuntimeConfigurationTimer: Timer? @@ -352,7 +351,7 @@ extension TunnelDetailTableViewController { let cell: KeyValueCell = tableView.dequeueReusableCell(for: indexPath) cell.key = tr("tunnelOnDemandKey") 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) } return cell