Swift:在if语句中设置自定义UITableViewCell类

时间:2016-05-25 21:17:47

标签: ios swift

我是一个Swift新手,并且正在努力做一些非常简单的事情。

我想在点击时更改tableViewCell的类。经过大量的谷歌搜索后,我现在尝试通过设置一个布尔标志(在一个字典中)并检查该值来确定要使用哪个类。

我试图在if语句中设置变量的Swift基础知识:

// I think I need to instantiate the cell variable here to be used inside 
// and after the if statement but don't know what class type to use.
// I've tried lots of "var cell: xxx = yyy" variations but no luck 

if selectedRows[indexPath.row] == true {
    let cell = tableView.dequeueReusableCellWithIdentifier("Tier3CellExpanded", forIndexPath: indexPath) as! Tier3CellExpanded
} else {
    let cell = tableView.dequeueReusableCellWithIdentifier("Tier3Cell", forIndexPath: indexPath) as! Tier3TableViewCell
}
let image = UIImage(named: entry.thumbnail)
cell.thumbImageView.image = image
cell.busNameLabel.text = entry.busName
cell.busAddressLabel.text = entry.address
return cell

如果有人能指出我正确的方向,那就太好了。

3 个答案:

答案 0 :(得分:2)

您可以尝试这样

if selectedRows[indexPath.row] == true {
        let cell = tableView.dequeueReusableCellWithIdentifier("Tier3CellExpanded", forIndexPath: indexPath) as! Tier3CellExpanded
    let image = UIImage(named: entry.thumbnail)
    cell.thumbImageView.image = image
    cell.busNameLabel.text = entry.busName
    cell.busAddressLabel.text = entry.address
    return cell
    } else {
        let cell = tableView.dequeueReusableCellWithIdentifier("Tier3Cell", forIndexPath: indexPath) as! Tier3TableViewCell
    let image = UIImage(named: entry.thumbnail)
    cell.thumbImageView.image = image
    cell.busNameLabel.text = entry.busName
    cell.busAddressLabel.text = entry.address
    return cell
    }

答案 1 :(得分:1)

我只是在扩展Charles A.的答案,向您展示如何在if语句之外声明单元格,但仍然使用2种不同的单元格类型。

//All shared properities would belong to this class
var cell: MySuperclassCellsInheritFrom
if selectedRows[indexPath.row] {
    cell = tableView.dequeueReusableCellWithIdentifier("Tier3CellExpanded", forIndexPath: indexPath) as! Tier3CellExpanded
    if let expandedCell = cell as? Tier3CellExpanded {
        //Set properties specific to Tier3CellExpanded
    }
}
else {
    cell = tableView.dequeueReusableCellWithIdentifier("Tier3Cell", forIndexPath: indexPath) as! Tier3TableViewCell
    if let regularCell = cell as? Tier3TableViewCell {
       //Set properties specific to Tier3TableViewCell
    }
}

// Configure cell
// Properties that both subclasses share can be set here

return cell

这是可能的,因为我们将cell声明为UITableViewCell,然后在使用标识符进行dequeing之后将其强制转换。转换是可能的,因为您要出列的单元格是UITableViewCell的子类。因此,在转换之后,您现在可以设置所有子类的各个属性。

如果您希望将其他代码应用于两个单元格,而不需要在每个if语句中复制,例如backgroundColor更改或其他基本UITableViewCell属性,则此方法非常有用。

答案 2 :(得分:0)

在您的代码中,您在if块中声明了一个常量,在else块中声明了另一个常量(这是let关键字的作用),所以这些将会出现在您设置它们之后立即超出范围。你的if语句之外是否有另一个名为cell的变量?

我希望代码看起来像:

let cell: SomeCellType
if selectedRows[indexPath.row] {
    cell = ...
}
else {
    cell = ...
}

// Configure cell

return cell