Некоторые значения отображаются как отключенные в табличном представлении, когда они не должны - PullRequest
0 голосов
/ 24 февраля 2020

Создание простого приложения для обмена валют, в котором пользователи могут выбрать одну валюту из списка, а затем другую из того же списка, который вызывается, и затем перенаправить в новое представление, где сравниваются валюты. После первого выбора я отключаю опцию выбора, чтобы ее нельзя было выбрать снова. Хотя он корректно отключает желаемое значение, он также случайным образом отключает другую сумму х, которую я не могу понять, почему. Не уверен, что я неправильно закодировал, поэтому любая помощь приветствуется. Функция, которая делает отключение в cellForRowAt

 class SelectCurrencyTableViewController: UITableViewController {

    var selectedCurrency: String?
    var codesToConvert = [String]()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    // Get the JSON data to insert into the table
    func parseJSONData()-> Array<Any> {
        var finalArray = [Any]()
        if let url = Bundle.main.url(forResource: "currencies", withExtension: "json") {
            do {
                let data = try Data(contentsOf: url)
                let jsonResult = try JSONSerialization.jsonObject(with: data)
                if var jsonArray = jsonResult as? [String] {

                    while jsonArray.count > 0 {
                        let result: [String] = Array(jsonArray.prefix(2))
                        finalArray.append(result)
                        jsonArray.removeFirst(2)
                    }
                }
            } catch {
                print(error)
            }
        }
        return finalArray
    }

    override func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return parseJSONData().count
    }

    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
            }
        }
        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if (selectedCurrency != nil){
            if let array = parseJSONData()[indexPath.row] as? [String] {
                codesToConvert.append(selectedCurrency!)
                codesToConvert.append(array[0])
            }
            self.performSegue(withIdentifier: "viewConversions", sender: self)

        } else {
            let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "tableView") as! SelectCurrencyTableViewController
            vc.modalPresentationStyle = .overCurrentContext

            if let array = parseJSONData()[indexPath.row] as? [String]{
                vc.selectedCurrency = array[0]
                show(vc, sender: self)
            }
        }
    }

    override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60.0
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "viewConversions" {
            let VCTV = segue.destination as! ViewConversionsTableViewController
            VCTV.codesToConvert = codesToConvert
        }
    }
}

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Обратите внимание, что ячейки табличного представления повторно используются , поэтому, когда вы удаляете ячейку из очереди в 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 каждый раз, когда вам нужна новая ячейка.

1 голос
/ 24 февраля 2020
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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...