繁体   English   中英

Swift 4 - 以随机顺序排列的多个tableview单元格类型

[英]Swift 4 - Multiple tableview cell types in a random order

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

我希望能够在同一个tableview中使用3种不同的细胞类型。

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

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

所以使用:

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

不可行。

任何有关如何实现这一目标的帮助或想法将不胜感激。

您需要根据您拥有的项目类型将单元格出列,而不是根据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
}

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

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

这会产生潜在的开销,因为您还必须更新其他待办事项及其排序顺序。 (例如:todo#5移动到位置#2,必须修改列表底部todos的属性)。

如果不期望您管理成千上万的待办事件就足够了。 另外,你需要更复杂的机制,如浮点数或字符串,并在背景中偶尔标准化它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM