我正在创建一个待办事项列表应用程序,并且在列表tableview中,需要3种类型的tableview单元格。一个用于一项任务,一个用于事件,一个用于提醒。每个单元格内部都有不同的元素(多个标签,不同的图像等)
我希望能够在同一张表格视图中使用3种不同的单元格类型。
我创建了3个UITableViewCell类,每个类都具有单元格约束和内部设置。在我的核心数据模型中,有3个实体。一个用于任务,事件和提醒。
此外,这是一个待办事项列表应用程序,因此,应按任意顺序和任意数量的每个自定义单元格排列单元格。
因此使用:
if indexPath.row == 0 {...} etc...etc...
将不可行。
对于实现这一目标的任何帮助或想法,将不胜感激。
答案 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,必须修改列表底部待办事项的属性)。
如果不希望您管理成千上万的待办事项,那就足够了。否则,您将需要更复杂的机制,例如浮点数或字符串,并在后台不时地对其进行规范化。