将Tableview单元格按字母顺序放入 - Swift 3和Firebase数据库

时间:2017-09-02 22:23:59

标签: ios swift uitableview firebase-realtime-database

我正在使用firebase将数据加载到tableview单元格中,这是我数据的结构。

struct postStruct {
    let title : String!
    let author : String!
    let bookRefCode : String!
    let imageDownloadString : String!
    let status : String!
    let reserved : String!
    let category : String!
    let dueDate : String!
}

现在我使用

按字母顺序排列帖子
 self.posts.sort(by: { $0.title < $1.title })

但我不知道如何将以A开头的单元格放在“A”和“B”部分中,依此类推。

class DirectoryTableView: UITableViewController {

    var posts = [postStruct]()

    override func viewDidLoad() {

    let databaseRef = Database.database().reference()

    databaseRef.child("Books").queryOrderedByKey().observe(.childAdded, with: {
    snapshot in

    var snapshotValue = snapshot.value as? NSDictionary
    let title = snapshotValue!["title"] as? String
    snapshotValue = snapshot.value as? NSDictionary

    let author = snapshotValue!["author"] as? String
    snapshotValue = snapshot.value as? NSDictionary

    let bookRefCode = snapshotValue!["bookRefCode"] as? String
    snapshotValue = snapshot.value as? NSDictionary

    let status = snapshotValue!["status"] as? String
    snapshotValue = snapshot.value as? NSDictionary

    let reserved = snapshotValue!["reserved"] as? String
    snapshotValue = snapshot.value as? NSDictionary

    let category = snapshotValue!["category"] as? String
    snapshotValue = snapshot.value as? NSDictionary

    let dueDate = snapshotValue!["dueDate"] as? String
    snapshotValue = snapshot.value as? NSDictionary


        self.posts.insert(postStruct(title: title, author: author, bookRefCode: bookRefCode, status: status, reserved: reserved, category: category, dueDate: dueDate) , at: 0)
    self.tableView.reloadData()


    })



     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return posts.count

     }




      override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    var cell = tableView.dequeueReusableCell(withIdentifier: "cell")

    let databaseRef = Database.database().reference()

    let label1 = cell?.viewWithTag(1) as! UILabel
    label1.text = posts[indexPath.row].title

    let label2 = cell?.viewWithTag(2) as! UILabel
    label2.text = posts[indexPath.row].author

    let label3 = cell?.viewWithTag(3) as! UILabel
    label3.text = posts[indexPath.row].bookRefCode

    let label4 = cell?.viewWithTag(4) as! UILabel
    label4.text = posts[indexPath.row].status

    let label5 = cell?.viewWithTag(5) as! UILabel
    label5.text = posts[indexPath.row].category

    let image1 = cell?.viewWithTag(6) as! UILabel
    image1.text = posts[indexPath.row].imageDownloadString

    let label6 = cell?.viewWithTag(7) as! UILabel
    label6.text = posts[indexPath.row].reserved

    let label9 = cell?.viewWithTag(9) as! UILabel
    label9.text = posts[indexPath.row].dueDate

    return cell!

}

任何想法,请帮忙!我试图用不同的方法对它们进行排序,但我很困惑!

1 个答案:

答案 0 :(得分:1)

首先,您需要一个新结构来保存按照第一个标题字母分组的帖子:let postsAlphabetically: [String:[Post]]

您没有指定Swift版本,因此假设您要迁移到Swift 4,您可以对数据进行排序并使用一行对其进行分组:

let postsAlphabetically = Dictionary(grouping: self.posts) { $0.title.first! }
// E.g: ["A" : ["A book", "Another book"], "B" : ["Blue Book", "Black Book"]]

稍后,您将在postsAlphabetically方法中使用self.posts代替cellForRowAt


P.S:Swift中的类型名称是用高级驼峰案例编写的(PostSimple而不是postSimple)。类型本身被省略(Author而不是AuthorClass)。