如何在Swift中动态创建cumstom TableViewCells?

时间:2015-09-16 08:56:29

标签: swift uitableview dynamic

我想创建自定义TableViewCells,因此我创建了一些从UITableViewCell扩展的类型typeACell / typeBCell。

现在在

tableView-cellForRowAtIndexPath -> UITableViewCell

我想动态返回单元格。当我想通过

创建一次返回值时,如何返回我的自定义单元格
let dynCell:UITableViewCell!

我的方法有哪些改变

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

    let cellTypeSelector = DynamicCellSelector.getTypeAnyhow()
    let dynCell:UITableViewCell!

    if cellTypeSelector.isTypeA() {
        dynCell = tableView.dequeueReusableCellWithIdentifier("typeACell", forIndexPath: indexPath) as? TypeACell
        (dynCell as! TypeACell).titleBar.text = ""
    }
    else if cellTypeSelector.isTypeB() {
        dynCell = tableView.dequeueReusableCellWithIdentifier("typeBCell", forIndexPath: indexPath) as? TypeBCell
        (dynCell as! TypeBCell).titleBar.text = ""
    }
    else {
        dynCell = tableView.dequeueReusableCellWithIdentifier("unknownTypeCell", forIndexPath: indexPath) as? UnknownTypeCell
        (dynCell as! UnknownTypeCell).titleBar.text = ""
    }

    return dynCell
}

这会引发错误:

  

变量' dynCell'在初始化之前使用

日Thnx!

3 个答案:

答案 0 :(得分:1)

试试这个(使用你的代码):

    let cellTypeSelector = DynamicCellSelector.getTypeAnyhow()
    let dynCell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("typeACell", forIndexPath: indexPath) as? TypeACell;
    if cellTypeSelector.isTypeB() {
        dynCell = tableView.dequeueReusableCellWithIdentifier("typeBCell", forIndexPath: indexPath) as? TypeBCell
        (dynCell as! TypeBCell).titleBar.text = ""
    }else{
        (dynCell as! TypeACell).titleBar.text = ""
    }

    return dynCell

答案 1 :(得分:1)

您收到此错误,因为初始化单元格的条件不明确。第一个if语句有一个else分支,但第二个if语句没有。如果两个条件均为假,则单元格将保持未初始化状态。

您可以通过添加第二个else分支来解决此问题:

if cellTypeSelector.isTypeA() {
    dynCell = tableView.dequeueReusableCellWithIdentifier("typeACell", forIndexPath: indexPath) as? TypeACell
    (dynCell as! TypeACell).titleBar.text = ""
}
else if cellTypeSelector.isTypeB() {
    dynCell = tableView.dequeueReusableCellWithIdentifier("typeBCell", forIndexPath: indexPath) as? TypeBCell
    (dynCell as! TypeBCell).titleBar.text = ""
}
else {
    dynCell = UITableViewCell()
}

return dynCell

如果您确定该单元格为TypeB,则可以删除第二个if语句:

if cellTypeSelector.isTypeA() {
    dynCell = tableView.dequeueReusableCellWithIdentifier("typeACell", forIndexPath: indexPath) as? TypeACell
    (dynCell as! TypeACell).titleBar.text = ""
}
else {
    dynCell = tableView.dequeueReusableCellWithIdentifier("typeBCell", forIndexPath: indexPath) as? TypeBCell
    (dynCell as! TypeBCell).titleBar.text = ""
}

return dynCell

答案 2 :(得分:0)

当我将let更改为var并解压缩它似乎有效的值时 - 这是正确的方法吗?

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{

    let cellTypeSelector = DynamicCellSelector.getTypeAnyhow()
    var dynCell:UITableViewCell!

    if cellTypeSelector.isTypeA() {
        dynCell = (tableView.dequeueReusableCellWithIdentifier("typeACell", forIndexPath: indexPath) as? TypeACell)!
        (dynCell as! TypeACell).titleBar.text = ""
    }
    else if cellTypeSelector.isTypeB() {
        dynCell = (tableView.dequeueReusableCellWithIdentifier("typeBCell", forIndexPath: indexPath) as? TypeBCell)!
        (dynCell as! TypeBCell).titleBar.text = ""
    }
    else {
        dynCell = (tableView.dequeueReusableCellWithIdentifier("unknownTypeCell", forIndexPath: indexPath) as? UnknownTypeCell)!
        (dynCell as! UnknownTypeCell).titleBar.text = ""
    }

    return dynCell
}