2017-09-02 104 views
0

我正在使用firebase將數據加載到tableview單元格中,這裏是我的數據結構。將Tableview單元格按字母順序排列 - Swift 3和Firebase數據庫

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! 

} 

任何想法,請幫助!我試圖用不同的方法對它們進行排序,但我很困惑!

回答

0

首先,你需要一個新的結構,以節省您的帖子將它劃分的首個冠軍頭銜的信:let postsAlphabetically: [String:[Post]]

沒有指定雨燕版本,所以假設你會遷移到斯威夫特4,你可以使用單個行中的數據和組排序是:

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

後來,你會在你的cellForRowAt方法使用postsAlphabetically代替self.posts


P.S:Swift中的類型名稱是用上部駱駝案例編寫的(PostSimple而不是postSimple)。類型本身被省略(Author而不是AuthorClass)。