问题描述
所以我试图显示一个 TableView,但我目前只得到一个空的 tableview。经过进一步检查,我发现 configure
块没有运行。这是为什么?
代码:
func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: teamCellIdentifier,for: indexPath)
print("reached")
func configure(cell: UITableViewCell,for indexPath: IndexPath) {
print("not reached")
guard let cell = cell as? TeamCell else {
return
}
let team = fetchedResultsController.object(at: indexPath)
cell.teamLabel.text = team.teamName
cell.scoreLabel.text = "Wins: \(team.wins)"
if let imageName = team.imageName {
cell.flagImageView.image = UIImage(named: imageName)
} else {
cell.flagImageView.image = nil
}
}
return cell
}
}
团队单元
class TeamCell: UITableViewCell {
// MARK: - IBOutlets
@IBOutlet weak var teamLabel: UILabel!
@IBOutlet weak var scoreLabel: UILabel!
@IBOutlet weak var flagImageView: UIImageView!
// MARK: - View Life Cycle
override func prepareForReuse() {
super.prepareForReuse()
teamLabel.text = nil
scoreLabel.text = nil
flagImageView.image = nil
}
}
解决方法
您的 tableView 为空或看起来为空以及您的 tableView 方法未被调用的原因有两个。
1)- 表格视图的高度或宽度等于 0,无需分别加载和显示 tableView 和 tableView 单元格。
2)- 您没有将 tableView 数据源和委托连接到您的视图控制器。
2.1) 您可以通过故事板添加 TableView 委托和数据源(见下图)
2.2) 您可以通过视图控制器中的代码添加 TableView 委托和数据源,例如:
2.2.1) 在 viewDidLoad() 方法中:
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// TableView Delegates & DataSource
tableView.delegate = self
tableView.dataSource = self
}
2.2.2) 或者查看 tableView outlet didSet(我更喜欢这种方式,如果我不通过故事板来做的话):
@IBOutlet weak var tableView: UITableView! {
didSet {
tableView.delegate = self
tableView.dataSource = self
}
}
,
您的代码具有如下结构:
// This next line defines a function called a
func a() {
print("a")
// This next line only defines a function called b:
// that is scoped inside the 'a' function
func b() {
print("b")
}
// Defining a function does not invoke the function
// That would need an actual call here like this:
// b()
}
// I can't call b here because it's nested inside the function 'a'
,
首先,您在函数内部有一个嵌套的 func 吗? 把它拿出来.... 然后在这一行之后:
let cell = tableView.dequeueReusableCell(withIdentifier: teamCellIdentifier,for: indexPath)
这样做:
configure(cell: cell,for indexPath: indexPath)