我是一个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
如果有人能指出我正确的方向,那就太好了。
答案 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