tableview.reload не работает после вызова array.removeAll () 5 - PullRequest
1 голос
/ 15 октября 2019

у меня есть табличное представление, которое не удаляет данные из ячейки после того, как я удаляю все элементы из массива и вызываю tableview.reloadata, в ячейке табличного представления у меня есть одна метка, и текст остается

gameScore являетсяэкземпляр моего класса, который имеет функцию для удаления всех элементов из массива

func reset(winnerPlayer: String){

        let alertView = UIAlertController(title: "Winner:" + " " + "\(winnerPlayer)", message: "", preferredStyle: .alert)

        alertView.addAction(UIAlertAction(title: "Restart", style: .destructive, handler: { action in
            print("Tapped")

            self.gameScore.resetArrays()

            DispatchQueue.main.async {
                self.teamA_tableview.reloadData()
            }

        }))

я вызываю функцию с помощью метода делегата на другом контроллере представления

if teamA_totalScore >= winningScore {
                        print("Winner")
                        self.dismiss(animated: true, completion: nil)
                        delegate?.reset(winnerPlayer: (delegate?.gameScore.teamA_name)!)

                    }
                }else{
                    delegate?.teamA_totalScore.text = ""
                }

это мой контроллер представления popUpгде объявляем делегата

class PopUpViewController: UIViewController {

        @IBOutlet weak var whiteView: UIView!
        @IBOutlet weak var teamsNameSegControl: UISegmentedControl!
        @IBOutlet weak var pointsTextField: UITextField!
        @IBOutlet weak var cancelButton: UIButton!
        @IBOutlet weak var addButton: UIButton!

        var winningScore = Int()

        weak var delegate: GameScoreViewController?

      ....
}

, это мой контроллер представления gameScore, и где я устанавливаю делегата

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toPopUp"{
        let popUpView = segue.destination as! PopUpViewController
        popUpView.delegate = self

    }

я вызываю функцию сброса, которая есть в моем контроллере представления gameScore из моегоконтроллер всплывающего окна

это мой делегат и источник данных для просмотра таблицы, я использую только teamA_tableView для проверки сброса функции, я пробовал использовать обе команды и teamB_tableview, но не сработал

extension GameScoreViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var numberOfRows = Int()

        if tableView == teamA_tableview{
            numberOfRows = gameScore.teamA_points.count

        }else if tableView == teamB_tableview{
            numberOfRows = gameScore.teamB_points.count
        }

        return numberOfRows
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if tableView == teamA_tableview {
         let cell = tableView.dequeueReusableCell(withIdentifier: "teamA_scoreCell", for: indexPath) as! ScoreTableViewCell
            cell.teamA_label.text = String(gameScore.teamA_points[indexPath.row])

        }else if tableView == teamB_tableview {
            let cell = tableView.dequeueReusableCell(withIdentifier: "teamB_scoreCell", for: indexPath) as! ScoreBTableViewCell
             cell.teamB_label.text = String(gameScore.teamB_points[indexPath.row])
        }
        return UITableViewCell()
    }

}

1 Ответ

4 голосов
/ 15 октября 2019
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if tableView == teamA_tableview {
         let cell = tableView.dequeueReusableCell(withIdentifier: "teamA_scoreCell", for: indexPath) as! ScoreTableViewCell
            cell.teamA_label.text = String(gameScore.teamA_points[indexPath.row])

        } else if tableView == teamB_tableview {
            let cell = tableView.dequeueReusableCell(withIdentifier: "teamB_scoreCell", for: indexPath) as! ScoreBTableViewCell
             cell.teamB_label.text = String(gameScore.teamB_points[indexPath.row])
        }
        return UITableViewCell()
    }

Я не знаю, как это работает перед перезагрузкой данных. Судя по вашему cellForRowAtIndexpath, вы возвращаете новый экземпляр UITableViewCell (), но не ваш ScoreTableViewCell или ScoreBTableViewCell

должен выглядеть следующим образом:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if tableView == teamA_tableview {
         let cell = tableView.dequeueReusableCell(withIdentifier: "teamA_scoreCell", for: indexPath) as! ScoreTableViewCell
            cell.teamA_label.text = String(gameScore.teamA_points[indexPath.row])
            return cell

        } else if tableView == teamB_tableview {
            let cell = tableView.dequeueReusableCell(withIdentifier: "teamB_scoreCell", for: indexPath) as! ScoreBTableViewCell
             cell.teamB_label.text = String(gameScore.teamB_points[indexPath.row])
             return cell
        } else {
             return UITableViewCell()
        }
    }

Кроме того, рекомендация: как для оценки команды А, так и для команды В вы, вероятно, должны иметь одну и ту же ячейку, а не две разные ячейки, например ScoreTableviewCell. Вы просто меняете название команды, майку, цвет и т. Д.

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