在搜索时发出跟踪/取消关注用户的问题?解析

时间:2016-02-03 23:46:59

标签: ios swift

下午好,

今天我遇到了一些解析问题。

我已经创建了一个UISearchController,从解析中加载了我的用户,因此我可以搜索各个用户,并添加了以下和取消关注功能。

我的问题是当我搜索特定用户并尝试关注他时:所以我搜索特定用户说" test"它显示应该,但当我点击跟随然后回去解析,看看是否"我"跟着测试我可以得到不同的结果。

它说我已经跟着例如" tester"这是第一个创建的用户。它似乎跟随Cell而现在是userId ......

之后我按照字母顺序对用户进行了管理,但是除了按照字母顺序跟随第一个用户之外,例如,如果我的用户名以" A"! p>

我不确定如何解决这个问题,所以我希望有人在这里做..我接受并欣赏各种提示和答案!

继承我的代码:

git branch -m master old-master
git branch -m new-branch master
git push -f origin master

1 个答案:

答案 0 :(得分:0)

您需要实现UISearchResultsUpdating协议才能实现此目的。它使用UISearchController(在iOS 8中引入),必须以编程方式而不是通过故事板添加,但不要担心,它非常简单。

这应该为你完成工作

由Russel提供。

class YourTableViewController: UITableViewController, UISearchBarDelegate, UISearchResultsUpdating {
    var searchUsers: [PFUser] = [PFUser]()
    var userSearchController = UISearchController()
    var searchActive: Bool = false

    // MARK: - Lifecycle

    override func viewDidLoad() {
        super.viewDidLoad()

        self.userSearchController = UISearchController(searchResultsController: nil)
        self.userSearchController.dimsBackgroundDuringPresentation = true

        // This is used for dynamic search results updating while the user types
        // Requires UISearchResultsUpdating delegate
        self.userSearchController.searchResultsUpdater = self

        // Configure the search controller's search bar
        self.userSearchController.searchBar.placeholder = "Search for a user"
        self.userSearchController.searchBar.sizeToFit()
        self.userSearchController.searchBar.delegate = self
        self.definesPresentationContext = true

        // Set the search controller to the header of the table
        self.tableView.tableHeaderView = self.userSearchController.searchBar
    }

    // MARK: - Parse Backend methods

    func loadSearchUsers(searchString: String) {
        var query = PFUser.query()

        // Filter by search string
        query.whereKey("username", containsString: searchString)

        self.searchActive = true
        query.findObjectsInBackgroundWithBlock { (objects: [AnyObject]?, error: NSError?) -> Void in

            if (error == nil) {
                self.searchUsers.removeAll(keepCapacity: false)
                self.searchUsers += objects as! [PFUser]
                self.tableView.reloadData()
            } else {
                // Log details of the failure
                println("search query error: \(error) \(error!.userInfo!)")
            }
            self.searchActive = false
        }
    }

    // MARK: - Search Bar Delegate Methods

    func searchBarSearchButtonClicked(searchBar: UISearchBar) {

        // Force search if user pushes button
        let searchString: String = searchBar.text.lowercaseString
        if (searchString != "") {
            loadSearchUsers(searchString)
        }
    }

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {

        // Clear any search criteria
        searchBar.text = ""

        // Force reload of table data from normal data source
    }

    // MARK: - UISearchResultsUpdating Methods

    // This function is used along with UISearchResultsUpdating for dynamic search results processing
    // Called anytime the search bar text is changed
    func updateSearchResultsForSearchController(searchController: UISearchController) {

        let searchString: String = searchController.searchBar.text.lowercaseString
        if (searchString != "" && !self.searchActive) {
            loadSearchUsers(searchString)
        }
    }

    // MARK: - Table view data source

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

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if (self.userSearchController.active) {
            return self.searchUsers.count
        } else {
            // return whatever your normal data source is
        }
    }

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("userCell") as! UserCell

        if (self.userSearchController.active && self.searchUsers.count > indexPath.row) {
            // bind data to the search results cell
        } else {
            // bind data from your normal data source
        }

        return cell
    }

    // MARK: - UITableViewDelegate

    override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        tableView.deselectRowAtIndexPath(indexPath, animated: true)

        if (self.userSearchController.active && self.searchUsers.count > 0) {
            // Segue or whatever you want
        } else {
            // normal data source selection
        }
    }
}