2015-01-29 2 views
0

검색 결과 테이블 뷰를 가져 와서 내용을 업데이트하는 데 어려움을 겪고 있습니다. 쿼리하려는 데이터가 Parse에서옵니다. 내 기록에 나타납니다. 그러나 UISearchBar에 무언가가 입력되면 searchResultsTableView는 필터링 된 결과를 표시하지 않습니다. 내가 뭘 놓치고 있니? 감사합니다! Swift UISearchBar Parse 구현

코드 :

import UIKit 

class DrinkSearchTableViewController: UITableViewController, UISearchBarDelegate { 


var cocktails:NSMutableArray = NSMutableArray() 
var filteredCocktails:NSMutableArray = NSMutableArray() 


@IBOutlet var searchBar: UISearchBar! = UISearchBar() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.searchBar.delegate = self 



} 

override func viewDidAppear(animated: Bool) { 
    if self.tableView == self.searchDisplayController?.searchResultsTableView { 
     loadFilteredData(" ") 
    } else { 
     loadData() 
    } 
} 

func searchBarShouldBeginEditing(searchBar: UISearchBar!) -> Bool { 
    return true 
} 

func searchBarShouldEndEditing(searchBar: UISearchBar!) -> Bool { 
    return true 

} 

func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
    loadFilteredData(" ") 
} 

func searchBar(searchBar: UISearchBar!, textDidChange searchText: String!) { 
    loadFilteredData(searchText) 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
    return 1 
} 

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

    if self.tableView == self.searchDisplayController?.searchResultsTableView { 
     return filteredCocktails.count 
    } 
    else { 
     return cocktails.count 
    } 

} 


override func tableView(tableView: UITableView?, cellForRowAtIndexPath indexPath: NSIndexPath?) -> UITableViewCell { 
    let cell = self.tableView!.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath!) as DrinkSeachTableViewCell 

    if self.tableView == self.searchDisplayController?.searchResultsTableView { 
     let cocktail:PFObject! = self.filteredCocktails.objectAtIndex(indexPath!.row) as PFObject 
     let theCocktail = cocktail.objectForKey("Name") as String? 
     cell.drinkNameLabel.text = theCocktail as String! 
    } else { 
     let cocktail:PFObject! = self.cocktails.objectAtIndex(indexPath!.row) as PFObject 
     let theCocktail = cocktail.objectForKey("Name") as String? 
     cell.drinkNameLabel.text = theCocktail as String! 
    } 

    return cell 
} 


func loadFilteredData(name:String){ 
    filteredCocktails.removeAllObjects() 
    var query : PFQuery = PFQuery(className: "Cocktail") 
    query.whereKey("Name", containsString: name) 
    query.limit = 50 
    query.findObjectsInBackgroundWithBlock { 
     (objects: [AnyObject]!, error: NSError!) -> Void in 
     if error == nil { 
      for object in objects{ 
       let cocktail:PFObject! = object as PFObject 
       println(cocktail.objectForKey("Name")) 
       self.filteredCocktails.addObject(cocktail as PFObject) 
       self.tableView.reloadData() 
      } 
     } else { 

     } 


    } 
} 



    func loadData() { 
     cocktails.removeAllObjects() 

     var query : PFQuery = PFQuery(className: "Cocktail") 
     query.limit = 50 
     query.findObjectsInBackgroundWithBlock{ 
      (objects:[AnyObject]!, error:NSError!) ->Void in 
      if error == nil { 
       // The find succeeded. 
       NSLog("Successfully retrieved \(objects.count) drinks.") 
       // Do something with the found objects 
       for object in objects{ 
        self.cocktails.addObject(object as PFObject) 
       } 
       self.tableView.reloadData() 
      } else { 
       // Log details of the failure 
       println("Error getting data") 
      } 

     } 
    } 


} 

답변

0

시도 :
self.searchDisplayController .searchResultsTableView.reloadData() 대신
: self.tableView.reloadData()

.. FUNC에서 loadFilteredData (name : String)


FUNCsearchBarSearchButtonClicked (검색 창 : UISearchBar)
대신 :

FUNC의 검색 창 (문자열 검색 창 : UISearchBar! textDidChange 검색 텍스트!)