可变地使用多个自定义单元格

时间:2016-08-24 17:25:55

标签: ios swift uitableview custom-cell

我正在使用一个不可点击的tableView来显示一个对象的不同信息。 对于这个信息,我有不同的自定义单元格类型,我放置了一个地图,如果我的对象有位置,一个有一个链接列表,另一个是多行标签,用于一些描述......例如。

我用以下方式管理这些单元格:

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

if indexPath.row == 0 {
    let cell: mapCell = tableView.dequeueReusableCellWithIdentifier("mapCell") as! MapCell
    return cell
} else if indexPath.row == 1 {
    let cell: textCell = tableView.dequeueReusableCellWithIdentifier("textCell") as! TextCell
    return cell
} else if indexPath.row == 2 {
    let cell: listCell = tableView.dequeueReusableCellWithIdentifier("listCell") as! ListCell
    return cell
}

}

到目前为止一切顺利,一切正常。我的问题是,并非每个对象都需要一个地图,其中一些只需要一些文本和一个列表,其他对象需要一个地图和一个列表,其他所有对象都需要。如果有条件,我希望我的tableView跳过一些单元格。

我知道,我可以创建一个符号数组来更改tableView的单元格数,但是只删除tableView的末尾,而不是特定的单元格。

我的一个想法是生成一个空单元格,可能高度为0或1,这样我就可以这样做:

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

if indexPath.row == 0 {
    if mapCellNeeded {
          let cell: mapCell = tableView.dequeueReusableCellWithIdentifier("mapCell") as! mapCell
    } else {
          let cell: emptyCell = tableView.dequeueReusableCellWithIdentifier("emptyCell") as! EmptyCell
    }
    return cell
} else if indexPath.row == 1 {
    ...
}...
}

把我不知道是否有效率的方法。希望你们能帮助我。

1 个答案:

答案 0 :(得分:0)

您的解决方案可行。另一种方法(非常好和很好)不是硬编码行号,而是使用枚举代替:

enum InfoCellType {
case Map
case Text
case Links
}

... 

var rows = [InfoCellType]()
... 
// when you know what should be there or not
func constructRows() {

if (mapCellNeeded) {
rows.append(InfoCellType.Map)
}
rows.append(InfoCellType.Text)
... etc
}

然后在表格视图方法中只看到当前indexPath的类型:

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

let cellType: InfoCellType = self.rows[indexPath.row]
switch cellType {
case .Map:
    let cell: mapCell = tableView.dequeueReusableCellWithIdentifier("mapCell") as! mapCell 
    return cell
case .Text:
    ...
case.Links:
    ...
}
}

此解决方案还允许轻松更改行的顺序 - 只需更改rows数组中项目的顺序。