Обратите внимание, что ячейки табличного представления повторно используются , поэтому, когда вы удаляете ячейку из очереди в didSelectRowAt
, полученная ячейка может быть одной из старых ячеек в табличном представлении. Табличные представления работают так, чтобы не было большого количества UITableViewCell
объектов, создаваемых, если ваше табличное представление действительно длинное.
Если вы просто так удалите одну из старых ячеек, которая отключена, эта ячейка останется отключенной, что и стало причиной неожиданного поведения. Чтобы это исправить, вам просто нужно установить ячейку во включенное состояние, когда она должна быть включена:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCellController
if let array = parseJSONData()[indexPath.row] as? [String]{
cell.countryCodeLabel.text = array[0]
cell.currencyLabel.text = array[1]
cell.countryFlag.image = UIImage(named: array[0])
// if selected is the same as the current one, disable that row
if (selectedCurrency == array[0]){
cell.isUserInteractionEnabled = false
cell.countryCodeLabel.alpha = 0.3
cell.currencyLabel.alpha = 0.3
cell.countryFlag.alpha = 0.3
} else {
cell.isUserInteractionEnabled = true
cell.countryCodeLabel.alpha = 1
cell.currencyLabel.alpha = 1
cell.countryFlag.alpha = 1
}
}
return cell
}
Я также рекомендую вам не вызывать parseJSONData
в методах источника данных табличного представления. Вы можете просто вызвать его один раз в viewDidLoad
, сохранить его в свойстве и вместо этого прочитать это свойство. Вам не нужно повторно анализировать данные JSON каждый раз, когда вам нужна новая ячейка.