在不同的单元笔尖中显示两组Firebase数据

时间:2018-12-06 19:24:27

标签: ios swift firebase firebase-realtime-database

我有一个这样的Firebase数据库:

Screen Shot

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
    }
 }

1 个答案:

答案 0 :(得分:0)

您可能希望有一个时间表,其中包含两种类型的项目:PostSong。 因此,一种方法是拥有一个超类和两个子类PostSong

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()
    }
}