оператор 'else' не работает в функции didSelectRowAt при выполнении - PullRequest
0 голосов
/ 09 июня 2018

не знаю, является ли оно общим или нет, но в функции 'didSelectRowAt' оператор 'if' выполняется отлично, а оператор 'else' - нет, и всякий раз, когда я нажимаю на ячейку, проверяемое свойство всегда имеет значение true, как показано нижекод, который может помочь: -

вот код: -

import UIKit
import Alamofire
import SwiftyJSON

class TableViewController: UITableViewController {

    var vCData  = [Item]()

    let url = "https://api.coinmarketcap.com/v1/ticker/"
    var items = [Item]()

    override func viewDidLoad() {
        super.viewDidLoad()
        getCoinData(url: url)
    }

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

    // MARK: - Table view data source

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

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        let arrayItem = items[indexPath.row]

        cell.textLabel?.text        = arrayItem.name
        cell.detailTextLabel?.text  = arrayItem.symbol

        if arrayItem.checked == true{cell.accessoryType = .checkmark}
        else{cell.accessoryType = .none}

        return cell
    }

ЭТО ГДЕ ПРОБЛЕМА ПРОИСХОДИТ: -

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        tableView.deselectRow(at: indexPath, animated: true)

        var selItem = items[indexPath.row]

        if selItem.checked == false {

            selItem.checked = true

            vCData.append(selItem)

        }else {                       // statement not working

            selItem.checked = false

            if let index : Int = self.vCData.index(where: {$0.name == selItem.name && $0.checked == selItem.checked && $0.buyPrice == selItem.buyPrice && $0.rank == selItem.rank && $0.symbol == selItem.symbol}) {

                self.vCData.remove(at: index)
                print(vCData,"\n")
            }
        }
        tableView.reloadData()
    }

    @IBAction func doneTapped(_ sender: UIBarButtonItem) {
        self.dismiss(animated: true, completion: nil)
    }

}

1 Ответ

0 голосов
/ 09 июня 2018

Если предположить, что Item является struct, а не class, ваша проблема связана с тем, что struct является типом значения, и копии создаются при назначении одной переменной другой.

В didSelectRowAt вы обновляете selItem, но это не меняет копию, хранящуюся в items.

Исправление простое.После вашего if/else обновите items новым selItem:

items[indexPath.row] = selfItem

На несвязанной ноте я заменил бы использование reloadData в didSelectRowAt на:

tableView.reloadRows(at: [ indexPath ], with: .fade)

Нет необходимости перезагружать всю таблицу только для обновления одной строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...