Swift 4-多种tableview单元格类型以随机顺序

时间:2018-09-22 14:08:26

标签: ios swift uitableview

我正在创建一个待办事项列表应用程序,并且在列表tableview中,需要3种类型的tableview单元格。一个用于一项任务,一个用于事件,一个用于提醒。每个单元格内部都有不同的元素(多个标签,不同的图像等)

我希望能够在同一张表格视图中使用3种不同的单元格类型。

我创建了3个UITableViewCell类,每个类都具有单元格约束和内部设置。在我的核心数据模型中,有3个实体。一个用于任务,事件和提醒。

此外,这是一个待办事项列表应用程序,因此,应按任意顺序和任意数量的每个自定义单元格排列单元格。

因此使用:

if indexPath.row == 0 {...} etc...etc...

将不可行。

对于实现这一目标的任何帮助或想法,将不胜感激。

2 个答案:

答案 0 :(得分:3)

您需要根据所拥有的项的种类而不是indexPath来使单元出队。

对于事件/提醒/任务,您有三个结构/类:

struct Event { ... }
struct Reminder { ... }
struct Task { ... }

并且:

var myTableViewArray: [Any] //Array of either Event, Reminder, Task objects.

tableView(_:cellForRowATt:)中:

func tableView(_ tableView: UITableView, 
  cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let object = myTableViewArray[indexPath.row]
    if let event = object as? Event {
        let cell = tableView.dequeueReusableCell(withIdentifier: "EventCellId" for:indexPath) as EventCell
        //configure cell with event
        return cell
    } else if let task = object as? Task {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCellId" for:indexPath) as TaskCell
        //configure cell with task
        return cell
    } else if let reminder = object as? Reminder {
        let cell = tableView.dequeueReusableCell(withIdentifier: "ReminderCellId" for:indexPath) as ReminderCell
        //configure cell with reminder
        return cell
    } else {
        //We shouldn't get into this case, but return an UITableViewCell here?
    }

}

如果您具有相同的对象,或者因为您添加了一个模拟该对象的协议,但是提供了一个属性(如枚举),那么该属性是事件/提醒/任务:

enum Type {
    case event
    case reminder
    case task
}

struct CustomObject {
   let type: Type
}

然后,而不是:

if let event = object as? Event {}
else if let task = object as? Task {}
else if let reminder = object as? Reminder {}

只需进行简单的切换即可:

switch object.type {
   case .event:
       //Dequeue the EventCell
   case .task:
       //Dequeue the TaskCell
   case .reminder:
       //Dequeue the ReminderCell
}

答案 1 :(得分:0)

向您的数据模型添加一个属性,该属性将跟踪其在当前待办事项列表中的排序顺序。根据该属性对该数据模型进行排序,它已准备好用于表indexPath。

它可能是整数。切换待办位置时,可以修改此属性。

这带来了潜在的开销,因为您还必须更新其他待办事项及其排序顺序。 (例如:待办事项5已移至位置2,必须修改列表底部待办事项的属性)。

如果不希望您管理成千上万的待办事项,那就足够了。否则,您将需要更复杂的机制,例如浮点数或字符串,并在后台不时地对其进行规范化。