UITableViewController和不同性质的项目

时间:2018-06-02 14:18:28

标签: ios swift uitableview

通常每当我创建一个UITableViewController时,我习惯于所有具有相似数据类型和样式的项目。例如,图像列表,用户名行或类似的行。

我正在帮助某人处理项目,并且要求是在屏幕的每一侧都有聊天气泡。这很容易,因为基于用户,我可以相应地显示/隐藏气泡并在每行上分配文本。聊天气泡在某种意义上是相似的,它只是文本和时间戳。 "性质"这个泡泡是一样的,只是朝向左边或右边。

然而,增加复杂性的部分是,如果有人在特定时间加入聊天Feed,他们想要显示此内容。这是一个例子:

enter image description here

正如您所看到的,它是聊天气泡但是在晚上9:23,我必须显示这一新行,表明有人加入了Feed。

我想我的DTO /数据绑定对象现在看起来像这样:

  • text:String //要显示的文本(如果相关)
  • userId:UUID //用户ID"采取行动"在此
  • actionDate:TimeInterval //加入或聊天的时间(可以是)
  • actionType:Int //或enum - 0表示他们加入,1表示他们聊天
  • alignRight:Bool //我可以让API确定上下文用户,并确定聊天气泡是否出现在右侧/左侧。

从UI角度来看,实现此绑定的简单方法是什么?我是否以某种方式使用表格页脚?或者我需要添加这个"加入活动"标签到每个表格单元格,并在每种情况下隐藏它,直到有人真正加入?

1 个答案:

答案 0 :(得分:1)

表视图可以显示多种类型的单元格。

大概你有一个自定义ChatCell(或者至少你真的应该)。它呈现聊天气泡,时间戳,您可以设置其对齐方式。

现在您应该定义第二个自定义单元格,例如EventCell。它应该包含呈现事件所需的一切,例如有人加入。

一旦您拥有了不同类型的自定义单元格,并且您已在表格视图中注册它们,您只需相应地对cellForRowAt进行编码。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let someData = someModel[indexPath.row]
    if someData.actionType == .chatted {
        // create, setup and return a ChatCell
    } else {
        // create, setup and return an EventCell
    }
}