这是我刚刚解决的一个错误,我想与社区分享,因为在搜索时我没有在网上找到任何答案,我问过的任何人都回答“嗯有趣......”但不知道发生了什么。
乍一看,我有一个tableView,显示了一些细胞,一些细胞只是空白。当我点击一个空白单元格时,内容将会显示(但直到点击一下)。
首先想到:这是一个数据问题,并且正在重新加载它。在创建和加载tableView之后,我尝试重新加载数据甚至各行,但这并没有解决问题。我还尝试将此调用分派给主队列,并在缺失/空白的indexPaths上调用setNeedsLayout
问题:我查看了调试器,我发现两个空白单元实际上确实存在,看起来它们应该看起来但是它们上面有一个空白单元 。没错,一排有两个单元,一个在另一排上面。
对于那些对细胞显示时的好奇心,我仍然不知道为什么会这样,但如果我敲击细胞,空白细胞就会落后。仍然会有两个单元格,但我现在可以看到自定义单元格,因为空白单元格在它后面。
numberOfCellsInRow
正在返回正确的数字,4 我看了cellForRowAtIndexPath
虽然我注意到正在使用UITableViewCell(泛型),但它看起来还不错。对我来说很奇怪的是,这是在另一个没有问题的视图控制器(secondVC
)上使用的相同设置。过了一段时间,我注意到了一些不同。
这是firstVC
上的一般模式。空白的UITableViewCell覆盖了“customCell”,而“genericCell”是故事板上的标准UITableViewCell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let genericCell = tableView.dequeReusableCell(withIdentifier: "genericCell")
if indexPath = IndexPath(row:0, section:0) {
if let customCell = self.dequeueReusableCell(withIdentifier: "myCustomCell") as? MyCustomCell {
return customCell
}
} else if indexPath = IndexPath(row:1, section:0) {
genericCell.titleLabel.text = "cell1"
} else if indexPath = IndexPath(row:2, section: 0) {
genericCell.titleLabel.text = "cell2"
}
return genericCell
}
现在secondVC
上的不同之处是第一行:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let genericCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "genericCell")
if indexPath = IndexPath(row:0, section:0) {......
我仍然不确定这是否是iOS / Xcode错误或者是否有合理的解释,但解决方案是仅在创建并返回customCells之后创建“genericCell”,如下所示:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath = IndexPath(row:0, section:0) {
if let customCell = self.dequeueReusableCell(withIdentifier: "myCustomCell") as? MyCustomCell {
return customCell
}
} else {
let genericCell = tableView.dequeReusableCell(withIdentifier: "genericCell")
if indexPath = IndexPath(row:1, section:0) {
genericCell.titleLabel.text = "cell1"
} else if indexPath = IndexPath(row:2, section: 0) {
genericCell.titleLabel.text = "cell2"
}
return genericCell
}
}
或通过init方法创建UITableViewCell而不是从故事板中将其出列 - 因为它在secondVC
上没有错误。
答案 0 :(得分:0)
我仍然不确定这是否是iOS / Xcode错误或者是否有合理的解释,但解决方案是仅在创建并返回customCells之后创建“genericCell”,如下所示:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath = IndexPath(row:0, section:0) {
if let customCell = self.dequeueReusableCell(withIdentifier: "myCustomCell") as? MyCustomCell {
return customCell
}
} else {
let genericCell = tableView.dequeReusableCell(withIdentifier: "genericCell")
if indexPath = IndexPath(row:1, section:0) {
genericCell.titleLabel.text = "cell1"
} else if indexPath = IndexPath(row:2, section: 0) {
genericCell.titleLabel.text = "cell2"
}
return genericCell
}
}
或通过init方法创建UITableViewCell而不是从故事板中将其出列 - 因为它在secondVC
上没有错误。
如果有人解释为什么需要这样做,请发帖作为答案,我很乐意将您的答案作为公认的答案!