UITableViewCOntroller中的swift多个单元格子类

时间:2014-10-01 12:01:42

标签: ios objective-c iphone uitableview swift

我试图将多个子类添加到UITableView中。问题是它一直给我以下错误:

Type UITableVieCell does not conform to protocol NilLiteralConvertible

的cellForRowAtIndexPath

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
}

4 个答案:

答案 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。