我有一个这样的Firebase数据库:
var posts = [Post]()
var songs = [Song]()
override func viewDidLoad() {
super.viewDidLoad()
let cellNib = UINib(nibName: "PostTableViewCell", bundle: nil)
tableView.register(cellNib, forCellReuseIdentifier: "postCell")
let songNib = UINib(nibName: "SongTableViewCell", bundle: nil)
tableView.register(songNib, forCellReuseIdentifier: "songCell")
我有2个不同的笔尖,并且能够提取数据,但是我不确定如何构造indexPath.row测试,以便我的表视图行可以根据数组所属的数据组切换显示的单元格样式至。我目前有一个带有静态if函数的测试,但是显然只在“发布”数据之后显示“歌曲”数据
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return posts.count + songs.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row < posts.count {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
cell.set(post: posts[indexPath.row])
return cell
} else {
let cell2 = tableView.dequeueReusableCell(withIdentifier: "songCell", for: indexPath) as! SongTableViewCell
cell2.set(song: songs[indexPath.row-posts.count])
return cell2
}
}
---------编辑----------
class Post:Item {
var imageURL: String!
convenience init(id: String, author: UserProfile, text: String, timestamp: Double, imageURL: String) {
self.init(id: id, author: author, text: text, timestamp: timestamp, imageURL: imageURL)
self.imageURL = imageURL
}
}
OR
class Post:Item {
var imageURL: String!
init(id: String, author: UserProfile, text: String, timestamp: Double, imageURL: String) {
super.init(id: id, author: author, text: text, timestamp: timestamp)
self.imageURL = imageURL
}
}
答案 0 :(得分:0)
您可能希望有一个时间表,其中包含两种类型的项目:Post
和Song
。
因此,一种方法是拥有一个超类和两个子类Post
和Song
class Item
author
timestamp
... other common properties
class Post: Item
text
...
class Song: Item
songName
...
然后,您只能拥有Item
个对象的数组
var items = [Item]()
,然后将其附加到items
数组中,而不是将它们附加到文章和歌曲数组中。
您还可以按timestamp
属性对项数组进行排序
items.sorted(by: { $0.timestamp > $1.timestamp })
最后,在numberOfRowsInSection
数据源方法中,仅返回项目数
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return items.count
}
以及在cellForRowAt
数据源方法集中,单元格取决于项是Song
还是Post
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let item = items[indexPath.row]
if let song = item as? Song {
let cell = tableView.dequeueReusableCell(withIdentifier: "songCell", for: indexPath) as! SongTableViewCell
cell.set(song: song)
return cell
} else if let post = item as? Post {
let cell = tableView.dequeueReusableCell(withIdentifier: "postCell", for: indexPath) as! PostTableViewCell
cell.set(post: post)
return cell
} else {
return UITableViewCell()
}
}