这有点棘手,但我会尽力解释。
我有 3个数组命名为:
ALLDATA 包含一个名为feedStruct的结构,它有两个参数;类型和日期(两个字符串)
twitterData 包含来自twitter的JSON,在TableViewController中显示3条推文作为单元格
了feeddata 包含来自我的网页的JSON,并显示包含该信息的单元格。这个JSON与twitter JSON不同 - 它们没有相同的参数,因此它们被分成两个不同的数组。
当JSON被提取到twitterData和feedData中时,它们每个都有一个函数添加它们的类型(" twitter"或" web")和推文/文章的日期作为将unix标记到allData(feedStruct)数组中。这样我可以对allData数组进行排序,因此单元格最新显示,如下所示。
然后我在cellForRow函数中有这段代码:
let sortedData = allData.sorted{ $0.date! > $1.date! }
if (sortedData[indexPath.row].type == "twitter") {
// Displaying twitter cell
let tweet = tweetData[indexPath.row]
return twitterCell
} else {
// Displaying web cell
let item: LocationModel = feedItems[indexPath.row - tweetData.count] as! LocationModel
return cell
}
然而问题是。目前,这三个Twitter单元格比最近添加的网络文章更新。但是,当文章比最近添加的推文更新时, let tweet 和 let item 的indexPath.row都将被搞砸,如同来自两个不同阵列的数据。
Feed示例
希望理解不要太乱图。我根本不知道,如果这是通过三个数组的方式去通过日期显示数据。 感谢您花时间阅读本文!
答案 0 :(得分:0)
我喜欢使用的模式是定义自己定义单元格类型和要显示的数据的枚举。您可以使用异构数据集合,而不是处理多个集合,以便按照枚举类型定义单元格。
示例:强>
class YourViewClass {
enum CollectionViewItem {
case Article(data: YourArticleData)
case Tweet(data: YourTweetData)
}
private let tableView = UITableView()
fileprivate var allData: [CollectionViewItem] = []
private var tweetData: [YourTweetData]
private var articleData: [YourArticleData]
init() {
super.init(frame: .zero)
tableView.delegate = self
tableView.dataSource = self
tableView.register(ArticleCell.self, reuseIdentifier: ArticleCell.reuseIdentifier)
tableView.register(TweetCell.self, reuseIdentifier: TweetCell.reuseIdentifier)
addSubview(tableView)
}
func configure(tweetData: YourTweetData) {
self.tweetData = tweetData
mergeAndSort()
}
func configure(articleData: YourArticleData) {
self.articleData = articleData
mergeAndSort()
}
private func mergeAndSort() {
allData = tweetData.map({ tweet in return CollectionViewItem.Tweet(data: tweet) }) + articleData.map({ article in return CollectionViewItem.Article(data: article) })
allData.sort() // You will have to figure out how you sort your elements
}
}
extension YourViewClass: UITableViewDataSource {
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch allData[indexPath.row] {
case .Article(let articleData):
let cell = tableView.dequeueReusableCell(withIdentifier: ArticleCell.reuseIdentifier, for: indexPath) as! ArticleCell
cell.configure(data: articleData)
return cell
case .Tweet(let tweetData):
let cell = tableView.dequeueReusableCell(withIdentifier: TweetCell.reuseIdentifier, for: indexPath) as! TweetCell
cell.configure(data: tweetData)
return cell
}
}
// Assuming theres only 1 section
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return allData.count
}
}