调用 array.removeAll() 后 tableview.reload 不起作用 swift 5

Posted

技术标签:

【中文标题】调用 array.removeAll() 后 tableview.reload 不起作用 swift 5【英文标题】:tableview.reload not working after array.removeAll() is called swift 5 【发布时间】:2019-10-14 23:38:26 【问题描述】:

在我从数组中删除所有项目并调用 tableview.reloadata 后,我有一个 tableview 没有从单元格中删除数据,在 tableview 单元格中我有一个标签并且文本保留

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 = ""
                

这是我的弹出视图控制器,用于声明委托

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

    

我正在从我的 popUp 视图控制器调用我的 gameScore 视图控制器中的重置函数

这是我的 tableview 委托和数据源,我只使用 teamA_tableView 来测试 func 重置,我确实尝试过同时使用和 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()
    


【问题讨论】:

delegate 是如何设置的?它是否指向视图控制器的正确实例?您是否设置了断点并逐步确认delegate 不是nil 我做了,两个“打印”语句都打印了,我使用了断点,它也能正常工作 但它是您的视图控制器的正确实例吗?一个常见的错误是没有正确设置委托,因此您没有与屏幕上的实例进行交互。你能显示你设置委托的代码吗? 我编辑了,看看@Paulw11 好的。你能出示numberOfRowsInSectioncellForRowAt 的代码吗 【参考方案1】:
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()
        
    

另外还有一个建议:对于 A 队的分数和 B 队的分数,您可能应该有相同的单元格,而不是像 ScoreTableviewCell 这样的两种不同类型的单元格。您只需更改球队名称、球衣、颜色等即可。

【讨论】:

现在可以使用了,非常感谢您的帮助

以上是关于调用 array.removeAll() 后 tableview.reload 不起作用 swift 5的主要内容,如果未能解决你的问题,请参考以下文章

OP-TEE TA:读写寄存器数据

量化指标程序库 ta-lib 安装方法

闭包的一点理解

HIKEY OP-TEE切换UART运行状态

HIKEY OP-TEE切换UART运行状态

如何使用 Groupby 将 Pandas TA 应用于数据框