【问题标题】:UITableView not updating dataUITableView 不更新数据
【发布时间】:2020-06-15 19:03:10
【问题描述】:

我曾尝试让“reloadData()”工作一段时间,但它不起作用。我什至试过“DispatchQueue.main.async{self.tableView.reloadData()}

下面是代码

import UIKit
import QuartzCore
import GameKit

enum Tags: Int {
    case levelLabel     = 100
    case background     = 101
    case highScoreLabel = 102
    case star1          = 201
    case star2          = 202
    case star3          = 203
}

let LightBlue   = UIColor.systemBlue
let Green       = UIColor.systemRed
let Purple      = UIColor.systemPurple
let Pink        = UIColor.systemPink
let Orange      = UIColor.systemOrange
let OneStarScore    =  5  
let TwoStarScore    = 10
let ThreeStarScore  = 15

let NumLevels = 11

class HomeViewController: UIViewController, UITableViewDataSource,
                            UITableViewDelegate, GKGameCenterControllerDelegate {

    @IBOutlet weak var tableView: UITableView!

    var highScores: [Int] = [Int]()
    var unlockedLevels = 0
    let colors = [LightBlue, Green, Purple, Pink, Orange]

    var tutorialPageVC: PageDataSourceViewController?
    var gameVC: GameViewController?



    override func viewDidLoad() {

        super.viewDidLoad()

        if #available(iOS 13.0, *) {
            tableView.separatorColor = UIColor.systemBackground
        } else {
            // Fallback on earlier versions
        }

        let storyboard = self.storyboard

        tutorialPageVC = storyboard?.instantiateViewController(withIdentifier: "PageDataSourceVC")
            as? PageDataSourceViewController

        gameVC = storyboard?.instantiateViewController(withIdentifier: "GameViewController")
            as? GameViewController

        // Trying to fix UITableView
        /// Put code here
        self.tableView.reloadData()

    }

    override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(false)

        let defaults = UserDefaults.standard

        if let scoresArray = defaults.array(forKey: "highScores") {

            highScores = scoresArray as! [Int]

            unlockedLevels = highScores.count - 1 // Subtract one for tutorial

            if highScores[unlockedLevels] >= 5 {
                unlockedLevels += 1 // Unlock additional level if last high score is greater than 5

            }
        }




    }

// MARK: - TableView data source methods

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

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return NumLevels
    }

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "LevelCell", for: indexPath) 

        cell.selectionStyle = UITableViewCell.SelectionStyle.none

        let view = cell.viewWithTag(Tags.background.rawValue) as UIView?
        let levelLabel = cell.viewWithTag(Tags.levelLabel.rawValue) as! UILabel
        let scoreLabel = cell.viewWithTag(Tags.highScoreLabel.rawValue) as! UILabel

        let star1 = cell.viewWithTag(Tags.star1.rawValue) as! UIImageView
        let star2 = cell.viewWithTag(Tags.star2.rawValue) as! UIImageView
        let star3 = cell.viewWithTag(Tags.star3.rawValue) as! UIImageView

        view?.layer.borderColor = colors[indexPath.row % 5].cgColor
        view?.layer.borderWidth = 6.0


        if indexPath.row == 0 {

            // Tutorial Level

            view?.alpha = 1.0
            levelLabel.text = "Tutorial"

            star1.isHidden = true
            star2.isHidden = true
            star3.isHidden = true

            scoreLabel.text = ""

        } else if indexPath.row + 1 <= highScores.count {

            // Levels that have been played

            view?.alpha = 1.0
            levelLabel.text = "Level \(indexPath.row)"

            star1.isHidden = false
            star2.isHidden = false
            star3.isHidden = false

            formatStars(highScores[indexPath.row], stars: [star1, star2, star3])

            scoreLabel.text = "High Score: \(highScores[indexPath.row])"
        } else {

            // Levels that have NOT been played

            view?.alpha = indexPath.row > unlockedLevels ? 0.5 : 1.0

            levelLabel.text = "Level \(indexPath.row)"

            star1.isHidden = true
            star2.isHidden = true
            star3.isHidden = true

            scoreLabel.text = ""

        }

        return cell
    }

    /// Display stars for each level on homepage
    func formatStars(_ score: Int, stars: [UIImageView]) {

        switch score {

        case 0..<OneStarScore:
            stars[0].image = UIImage(named: "star-empty")
            stars[1].image = UIImage(named: "star-empty")
            stars[2].image = UIImage(named: "star-empty")

        case OneStarScore..<TwoStarScore:
            stars[0].image = UIImage(named: "star")
            stars[1].image = UIImage(named: "star-empty")
            stars[2].image = UIImage(named: "star-empty")

        case TwoStarScore..<ThreeStarScore:
            stars[0].image = UIImage(named: "star")
            stars[1].image = UIImage(named: "star")
            stars[2].image = UIImage(named: "star-empty")

        default:
            stars[0].image = UIImage(named: "star")
            stars[1].image = UIImage(named: "star")
            stars[2].image = UIImage(named: "star")
        }

    }

// MARK: - TableView delegate methods

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if indexPath.row == 0 {

            self.present(tutorialPageVC!, animated: true, completion: nil)

        } else if indexPath.row <= unlockedLevels {

            gameVC!.level = indexPath.row
            self.present(gameVC!, animated: true, completion: nil)

            // performSegueWithIdentifier("LevelSegue", sender: self)

        }

    }

【问题讨论】:

  • 你把table view的delegate和数据源设置为HomeViewController了吗?
  • 你建议我怎么做?我对 UITableView 还很陌生,所以你能指导我吗?
  • 好的,我会写一个答案来指导你。
  • 你在哪里更改值?
  • 在另一个视图控制器中

标签: ios swift iphone xcode reloaddata


【解决方案1】:

可能UITableView 与委托和数据源之间的连接未设置。 您可以通过 ctrl+从表格视图拖动到视图控制器并设置 delegatedata source 出口在情节提要中执行此操作。

或者你可以在代码中这样做,例如在viewDidLoad:

self.tableView.dataSource = self
self.tableView.delegate = self

【讨论】:

  • tableview 仍然没有更新
  • 连接已设置
  • 那么究竟是什么“不工作”? tableView(_:cellForRowAt) 被调用了吗? tableView(_:numberOfRowsInSection) 被调用了吗?如果不确定,请设置断点。
  • 他们都被调用了
  • 那么您的单元格似乎无法正常工作。首先尝试使用默认单元格let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "id"),并仅设置标题,以检查是否有效
【解决方案2】:

你需要设置dataSource和delegate给self

override func viewDidLoad() {

        super.viewDidLoad()
        tableView.delegate = self
         tableView.datasource = self
}

并像这样直接赋值

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

        let cell = tableView.dequeueReusableCell(withIdentifier: "LevelCell", for: indexPath) as? LevelCell

          cell?.star1.isHidden = true
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多