对自定义UITableViewCells进行排序(Swift 2,Xcode 7)

时间:2016-06-30 22:28:05

标签: uitableview sorting swift2 xcode7 tableviewcell

尝试创建一个按用户排序帖子的应用程序" up vote"像Reddit。

一直在寻找如何根据"投票"帖子有的(一个Int值)。

在显示帖子的视图控制器中,我认为大部分内容都是相关的。我也在视图中找到了一个搜索栏。

使用以下代码运行时,我的视图控制器中不会显示任何内容。

非常感谢任何帮助

import UIKit
import Firebase

class FeedVC: UIViewController, UITableViewDataSource, UITableViewDelegate, UISearchBarDelegate {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var searchBar: UISearchBar!

var ref: FIRDatabaseReference!
var posts = [Post]()
static var imageCache = NSCache()
var inSearchMode = false
var filteredVenues = [Post]()
var sortByVotes = [Post]()

private var _post: Post?

var post: Post? {
    return _post
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.dataSource = self
    tableView.delegate = self
    searchBar.delegate = self
    searchBar.returnKeyType = UIReturnKeyType.Done 

    tableView.estimatedRowHeight = 368

    ref = FIRDatabase.database().reference()

    DataService.ds.REF_POSTS.observeEventType(.Value, withBlock: { snapshot in

        print(snapshot.value)

        self.sortByVotes = []

        if let snapshots = snapshot.children.allObjects as? [FIRDataSnapshot] {

            for snap in snapshots {

                print("SNAP: \(snap)")

                if let postDict = snap.value as? Dictionary<String, AnyObject> {

                    let key = snap.key
                    let post = Post(postKey: key, dictionary: postDict)
                    self.sortByVotes.append(post)
                }
            }

        }

        self.tableView.reloadData()

    })

}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {

    return 1
}

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

    if inSearchMode {
        return filteredVenues.count
    }

    return sortByVotes.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    //let post = posts[indexPath.row]

    if let cell = tableView.dequeueReusableCellWithIdentifier("PostCell") as? PostCell {

        cell.request?.cancel()

        var img: UIImage?

        let post: Post!

        posts = posts.sort{$0.votes > ($1.votes)} // added this*****


        if inSearchMode {
            post = filteredVenues[indexPath.row]

        } else {
            post = sortByVotes[indexPath.row]
        }

        if let url = post.imageUrl {
            img = FeedVC.imageCache.objectForKey(url) as? UIImage
        }

        cell.configureCell(post, img: img)

        return cell

    } else {

        return PostCell()
    }


}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

    let post = sortByVotes[indexPath.row]

    if post.imageUrl == nil {
        return 200
    } else {

        return tableView.estimatedRowHeight
    }
}

func searchBarSearchButtonClicked(searchBar: UISearchBar) {
    view.endEditing(true)
}

func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
    if searchBar.text == nil || searchBar.text == "" {
        inSearchMode = false
        view.endEditing(true)
        posts = posts.sort{$0.votes > ($1.votes)} //added this ***
        tableView.reloadData()
    } else {
        inSearchMode = true
        let lower = searchBar.text!.lowercaseString
        filteredVenues = sortByVotes.filter({$0.venueName!.rangeOfString(lower) != nil})
        tableView.reloadData()
    }
}

func sortPosts(){ //removed this function******

    sortByVotes = posts.sort { $0.votes > ($1.votes)}
    tableView.reloadData()
}
}

1 个答案:

答案 0 :(得分:0)

因为您已经意识到问题是没有调用单元格排序的函数。我知道你将整个排序代码移到了cellForRowAtIndexPath中,但如果你把它带回一个函数并且无需重复代码就可以随时调用它,它将更易于维护和重用。

看起来像这样:

func sortPosts(){  //as you already did

    sortByVotes = posts.sort { $0.votes > ($1.votes)}
    tableView.reloadData()
}

和以下行调用您当前正在对单元格进行排序的排序函数:

self.sortPosts();