我有一个tableview在从数组中删除所有项目并调用tableview.reloadata后没有从单元格中删除数据,在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()
}
}))
我在另一个viewcontroller上使用委托方法调用func
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
}
我正在从我的popUp视图控制器中调用gameScore视图控制器中的重置功能
这是我的tableview委托和数据源,我仅使用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()
}
}
最佳答案
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。您只需更改团队名称,球衣,颜色等即可。