我试图将多个子类添加到UITableView中。问题是它一直给我以下错误:
Type UITableVieCell does not conform to protocol NilLiteralConvertible
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = self.section1[indexPath.row]
cell.accessoryType = .DisclosureIndicator
return cell
} else if indexPath.section == 1 {
let cell = tableView.dequeueReusableCellWithIdentifier("SwitchViewCell", forIndexPath: indexPath) as SwitchViewCell
cell.cellLabel?.text = self.section2[indexPath.row]
return cell
}
return nil
}
答案 0 :(得分:8)
你不能返回零。而是默认返回空单元格。
var cell :UITableViewCell!
switch (indexPath.row) {
case 0:
cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = self.section1[indexPath.row]
cell.accessoryType = .DisclosureIndicator
break;
case 1:
cell = tableView.dequeueReusableCellWithIdentifier("SwitchViewCell", forIndexPath: indexPath) as SwitchViewCell
(cell as SwitchViewCell).cellLabel?.text = self.section2[indexPath.row]
break;
default:
break;
}
return cell
确保您已注册笔尖
self.tableView.registerNib(UINib(nibName: "SwitchViewCell", bundle: nil), forCellReuseIdentifier: "SwitchViewCell")
答案 1 :(得分:6)
tableView:cellForRowAtIndexPath:
必须返回UITableViewCell
,且无法返回nil
。因此,您必须删除return nil
。但它还不够。您的if else
声明也必须完整。这意味着必须提供每个可能的section
值,或至少发送给它。
您的if else
声明应如下所示:
if indexPath.section == 0 {
/* ... */
} else if indexPath.section == 1 {
/* ... */
} else {
/* ... */
}
或者像这样:
if indexPath.section == 0 {
/* ... */
} else {
/* ... */
}
但是,以下if else
语句未完成:
if indexPath.section == 0 {
/* ... */
} else if indexPath.section == 1 {
/* ... */
}
在这种情况下,如果验证了这些条件,tableView:cellForRowAtIndexPath:
将无法知道返回什么。因此,如果您尝试它,Xcode(即智能)也将显示错误消息:
在预期返回的函数中缺少返回' UITableViewCell'
因此,以下代码应该有效:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if indexPath.section == 0 {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = self.section1[indexPath.row]
cell.accessoryType = .DisclosureIndicator
return cell
} else {
let cell = tableView.dequeueReusableCellWithIdentifier("SwitchViewCell", forIndexPath: indexPath) as SwitchViewCell
cell.cellLabel?.text = self.section2[indexPath.row]
return cell
}
}
<强> PS:强>
如果您还在switch
方法中使用tableView:cellForRowAtIndexPath:
语句来设置单元格,this answer to a similar question可能对您有帮助。
答案 2 :(得分:0)
在我的情况下,我执行了以下操作:
let cellOne = mTableView.dequeueReusableCell(withIdentifier: "CellOne") as! customTableViewCellOne
let cellTwo = mTableView.dequeueReusableCell(withIdentifier: "CellTwo") as! customTableViewCellTwo
if (..something...) {
cellOne.mLabel = "hey"
return cellOne
}
else if (..another condition..) {
cellTwo.mButton.layer.cornerRadius = 5
return cellTwo
}
return UITableViewCell()
我希望对您有帮助
答案 3 :(得分:-4)
您不能为cellForRowAtIndexPath
返回nil你可以在最后使用:
let cell:UITableViewCell!
return cell
而不是
return nil
这应该是(如果你只有2个部分)永远不会被执行。
编辑:
如果indexPath.section == 1 {&#34;还可以使用&#34;} else。 only} else { - 返回一个单元格。我刚刚出现了什么问题。或者使用Switch / Case并默认返回空Cell。