2014-09-03 59 views
2

查找通过UISearchBar解析用户并在表格视图中显示结果。 当我加热搜索时,什么都没有发生...... 我的想法是使用searchText.text作为查询PFUser。Swift iOS:通过UISearchBar查找解析用户,并通过显示编组结果查看表结果

我应该尝试使用searchBar而不是搜索显示控制器吗? 有什么想法?

import UIKit 


    class AllFriendsTableViewController: UITableViewController, UISearchBarDelegate,  UISearchDisplayDelegate { 
@IBOutlet var SearchDisplay: UISearchDisplayController! 



var userList:NSMutableArray = NSMutableArray() 


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

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

} 

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



@IBOutlet var searchText: UISearchBar! 



func loadUser() { 

    userList.removeAllObjects() 
    var findUser:PFQuery = PFUser.query() 
    findUser.whereKey("username", equalTo: searchText.text) 


    findUser.findObjectsInBackgroundWithBlock { (objects:[AnyObject]!, error:NSError!) -> Void in 
     if !(error != nil) { 
      // The find succeeded. 
      println("succesfull load Users") 
      // Do something with the found objects 
      for object in objects { 
       self.userList.addObject(object) 
       println("users added to userlist") 
      } 
      self.tableView.reloadData() 
     } else { 
      // Log details of the failure 
      println("error loadind user ") 
      println("error") 
     } 

    } 
} 


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

override func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int { 
    if tableView == searchDisplayController.searchResultsTableView { 
     return userList.count 
    } 
    else { 
     return 0 
    } 
} 



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



    let cell: AllFirendsTableViewCell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)as AllFirendsTableViewCell 


    let users:PFObject = self.userList.objectAtIndex(indexPath!.row) as PFObject 


    var findUserName:PFQuery = PFUser.query() 
    findUserName.whereKey("username", containsString: searchText.text) 



    findUserName.findObjectsInBackgroundWithBlock{ 
     (objects:[AnyObject]!, error:NSError!) -> Void in 

     if !(error != nil) { 

      if let user:PFUser = users as? PFUser { 
       cell.userNameTextField.text = user.username 
       println("user exist") 
       // define avatar poster 

       if let avatarImage:PFFile = user["profileImage"] as? PFFile { 
        avatarImage.getDataInBackgroundWithBlock{(imageData:NSData!, error:NSError!)-> Void in 

         if !(error != nil) { 

          let image:UIImage = UIImage(data: imageData) 


          cell.avatarImage.image = image as UIImage 
          cell.avatarImage.layer.cornerRadius = 24 
          cell.avatarImage.clipsToBounds = true 

         } 

        } 

       } 
       else { 
        cell.avatarImage.image = UIImage(named: "Avatar-1") 
        cell.avatarImage.layer.cornerRadius = 24 
        cell.avatarImage.clipsToBounds = true 
       } 
      } 

     } 


    } 

    return cell 

} 



override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(true) 
    navigationController.navigationBar.hidden = false 
    loadUser() 

} 


override func viewDidAppear(animated: Bool) { 

} 

override func viewDidLoad() { 


    // Do any additional setup after loading the view, typically from a nib. 
} 

}

+0

您应该在搜索按钮被点击时搜索用户,但目前您使用cellForRow方法进行搜索。这是错误的。在raywenderlich.com上有一篇关于搜索栏的文章,阅读它。 – Shmidt 2014-09-03 14:06:15

+0

谢谢,但我已经读了这个tuto。如果我像raywenderlich.com那样做,我必须下载所有解析用户,然后过滤结果。我宁愿只下载与searchText.text匹配的用户。 – jmcastel 2014-09-03 15:41:42

+0

对不起,我错了。我检查了你的代码,它看起来不错。 – Shmidt 2014-09-03 17:33:41

回答

0

我怀疑这可能是由于您试图重新从您的网络请求发生在后台线程的实现代码如下。 UI更新应该从主线程发生。

在你loadUser()功能尝试从主线程做你的tableview重装,具体如下:

NSOperationQueue.mainQueue().addOperationWithBlock({ 
    self.tableView.reloadData() 
}) 

,可能会解决您的问题。

+0

那些withBlock:从解析方法运行主线程上的块。 – danh 2014-12-07 17:25:27