不同子类的数组.UITableView data.



我有一个超级类包装器。

class Wrapper {
var id: Int?
var createdAt: Date?
}

我有两个类,分别是子类包装器、消息和事务。

class Message : Wrapper{
/*
Message properties defined
*/ 
}
class Transaction : Wrapper{
/*
Transaction properties defined
*/ 
}

现在我有一个显示对话的 UITableview,并且来自"消息"和"事务"类型的两个数组的数据。此视图将显示按创建时间排序的消息和事务。

Conversation 类如下所示:

class Conversation{
var messages : [Message];
var transactions : [Transaction];
}

我的问题是,我如何准确地使用来自两个数组的合并数据来获取 cellforItem 委托方法,按 createdAt 变量的顺序?

您可以通过将数组定义为[Wrapper]来存储Message类和Transaction类的实例,因为两者都是Wrapper的子类。 然后,您可以按createdAt属性对数组进行排序,因为您的两个类都从Wrapper继承此属性。

如果需要根据确切的子类在UITableViewCell中显示不同的数据,则可以在cellForRowAt方法中有条件地向下转换Wrapper对象并采取相应的操作。

创建一个 [wrapper] 数组,将消息和事务数组都放入其中,并按 createdAt 对其进行排序。

我遇到同样的问题不止两次。如果您确实不想破坏数据,则可以index array索引数据。

例:

enum ArrayType {
case message
case transaction
}
let messages = [Int]()
let transactions = [Int]()
var indexes = [Index]()
struct Index {
var arrayIndex = 0
var arrayType = ArrayType.message
}
func indexYourData() {
indexes = []
var messagesIndexDone = messages.count==0
var transactionIndexDone = transactions.count==0
var messageIndex = 0
var transactionIndex = 0
var appendTypeIsMessage = false
while !messagesIndexDone || !transactionIndexDone {
appendTypeIsMessage = false
if transactionIndexDone {
appendTypeIsMessage = true
} else if messagesIndexDone {
appendTypeIsMessage = false
} else {
appendTypeIsMessage = messages[messageIndex].date > transactions[transactionIndex].date
}
if appendTypeIsMessage {
indexes.append(Index.init(arrayIndex: messageIndex, arrayType: .message))
messageIndex += 1
messagesIndexDone = messageIndex>=messages.count
} else {
indexes.append(Index.init(arrayIndex: transactionIndex, arrayType: .transaction))
transactionIndex += 1
transactionIndexDone = transactionIndex>=transactions.count
}
}
}

最新更新