我使用此时未显示我的tableview单元格字幕:
grails:
controllers:
upload:
maxRequestSize: 10000
maxFileSize: 10000
multipart:
maxRequestSize: 5MB
maxFileSize: 5MB
但是如果我使用它:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell:UITableViewCell?
if tableView.tag == 1 {
guard let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell") else {
return UITableViewCell(style: .subtitle, reuseIdentifier: "latestCell")
}
latestCell.textLabel?.text = latest[indexPath.row]
latestCell.detailTextLabel?.text = latestSub[indexPath.row]
latestCell.accessoryType = .disclosureIndicator
return latestCell
}
}
字幕加载完美,但在关闭应用程序并重新加载视图后,应用程序会自动退出而不会显示崩溃日志或将我带到调试选项卡。
我知道数据来自的数组很好,我认为我已经在故事板中设置了所有内容。关于这个问题已经发布了很多类似的问题,但它们似乎都归结为忘记将cellStyle设置为.subtitle。提前感谢我的帮助!
顺便说一句。我的常规单元格标题正如我所希望的那样工作。没问题。
编辑:
我认为问题是我可以创建一个没有问题的默认样式的单元格。但是当我尝试将样式设置为.subtitle时,第一次正确加载,但第二次打开时,它会崩溃。有没有办法将这两种声明一起使用,它们不会相互消除;?
else if tableView.tag == 2 {
let olderCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "olderCell")
olderCell.textLabel?.text = older[indexPath.row]
olderCell.detailTextLabel?.text = olderSub[indexPath.row]
olderCell.accessoryType = .disclosureIndicator
return olderCell
} else {
return cell!
}
}
和:
guard let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell") else {
return UITableViewCell(style: .subtitle, reuseIdentifier: "latestCell")
}
答案 0 :(得分:1)
老但是...
我认为问题是:
guard let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell") else {
return UITableViewCell(style: .subtitle, reuseIdentifier: "latestCell")
}
将返回一个“空”单元格。
所以..就像:
var latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell")
if latestCell == nil {
latestCell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "latestCell")
}
// your stuff
答案 1 :(得分:0)
这样做:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell:UITableViewCell = self.tableView.dequeueReusableCellWithIdentifier("latestCell") as UITableViewCell
cell.textLabel?.text = latest[indexPath.row]
cell.detailTextLabel?.text = latestSub[indexPath.row]
cell.accessoryType = .disclosureIndicator
return cell
}
如果这解决了您的问题,请将此标记为解决方案/ upvote。
答案 2 :(得分:0)
最简单的解决方案:
直接在表格视图中设置Interface Builder中的两个单元格,将样式和附件视图设置为所需的值并添加标识符。
然后代码可以缩减为。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch tableView.tag {
case 1:
let latestCell = tableView.dequeueReusableCell(withIdentifier: "latestCell" for: indexPath)
latestCell.textLabel!.text = latest[indexPath.row]
latestCell.detailTextLabel!.text = latestSub[indexPath.row]
return latestCell
case 2:
let olderCell = tableView.dequeueReusableCell(withIdentifier: "olderCell" for: indexPath)
olderCell.textLabel!.text = older[indexPath.row]
olderCell.detailTextLabel!.text = olderSub[indexPath.row]
return olderCell
default:
fatalError("That should never happen")
}
}
由于单元格已预定义为字幕样式,因此textLabel
和detailTextLabel
都可以保证存在且可以安全地展开。
然而,细胞之间的显着差异是什么。从给定的代码中,您实际上可以使用一个单元格(标识符cell
)。这可以使代码更短:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell" for: indexPath)
if tableView.tag == 1 {
cell.textLabel!.text = latest[indexPath.row]
cell.detailTextLabel!.text = latestSub[indexPath.row]
} else {
cell.textLabel!.text = older[indexPath.row]
cell.detailTextLabel!.text = olderSub[indexPath.row]
}
return cell
}
答案 3 :(得分:0)
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") //replace "Cell" with your identifier
cell.textLabel = yourTitleArray[indexPath.row]
cell.detailTextLabel = yourSubtitleArray[indexPath.row]
return cell!
}
答案 4 :(得分:0)
今天也遇到了这个问题。我认为原始的发帖人找到了答案,但是对于将来遇到此问题的其他人来说,这就是我解决的方法。请注意,此链接/线程也说明了求解的其他方法。 How to Set UITableViewCellStyleSubtitle and dequeueReusableCell in Swift?
环境:Swift 5.0和Xcode版本10.2.1。
说明:我通过将UITabelViewCell子类化并使用.subtitle类型进行初始化(请参见下面的代码)来解决此问题。请注意super.init方法中的.subtitle。
一旦有了子类,别忘了将CustomCell注册到tableView并在tableView方法cellForRowAt中向下转换为CustomCell。
class CustomCell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这是cellForRowAt方法的代码,该方法具有titleLabel和detailTextLabel(subtitle)属性。请注意,向下标为“ as!CustomCell”。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cellId", for:
indexPath) as! CustomCell
cell.textLabel?.text = someArray[indexPath.row].title // Note someArray would have to be replaced with your array of strings.
cell.detailTextLabel?.text = someArray[indexPath.row].subtitle // Note someArray would have to be replaced with your array of strings.
return cell
}