2016-06-30 4 views
0

Reddit와 같은 사용자가 "득표"하여 게시물을 정렬하는 응용 프로그램을 만들려고합니다.사용자 지정 UITableViewCells 정렬 (Swift 2, Xcode 7)

게시물에있는 "투표"(Int 값)의 수로 셀을 정렬하는 방법을 알아 내려고 노력하고 있습니다.

게시물이 표시되는보기 컨트롤러에서 나는 이것이 대부분 관련 있다고 생각합니다. 나는 또한 여기에 놀이에있는보기에 검색 막대를 가지고있어.

아래 코드를 실행하면 아무 것도 내 View Controller에 표시되지 않습니다. 이미 문제가 세포 정렬 된 함수가 호출되지 않았 음을 깨달았다로

은 어떤 도움이 많이

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

가 (당신이'FUNC의 sortPosts를 호출)를' 어딘가에? –

+0

안녕하세요 빅터, 나는 그 기능을 제거하고'textDidChange' 함수와'cellForRowAtIndexPath' 함수에'posts = posts.sort {$ 0.votes> ($ 1.votes)}'를 추가했습니다. 위를보십시오 – ryanbilak

+0

하지만 지금은 작동하고 있습니다 ? –

답변

0

그래서 감사하겠습니다. 나는 당신이 전체 정렬 코드를 cellForRowAtIndexPath으로 옮겼다는 것을 알고 있지만, 함수에 다시 가져 와서 코드를 반복하지 않고 원하는 모든 시간에 호출하면 재사용하기가 쉽고 유지 관리가 쉽습니다.

그것과 같을 것이다 : 현재 셀을 정렬하는 정렬 함수를 호출하는

func sortPosts(){ //as you already did 

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

하고 다음 줄을 :

self.sortPosts();