Ios 搜索时是否出现以下用户/取消以下用户?作语法分析

Ios 搜索时是否出现以下用户/取消以下用户?作语法分析,ios,swift,Ios,Swift,下午好 今天我在解析方面遇到了一些问题 我已经创建了一个UISearchController,从parse加载了我的用户,这样我就可以搜索单个用户,并且我还添加了一个如下的功能 我的问题是,当我搜索一个特定的用户并试图跟踪他时:所以我搜索一个特定的用户,说“test”,它会按它应该显示的那样显示,但当我单击follow,然后返回到parse,查看“I”是否跟踪了test,我可以得到不同的结果 它说我遵循了第一个用户创建的“tester”这个例子。它看起来像是在跟踪单元格,现在是用户ID 之后,我

下午好

今天我在解析方面遇到了一些问题

我已经创建了一个UISearchController,从parse加载了我的用户,这样我就可以搜索单个用户,并且我还添加了一个如下的功能

我的问题是,当我搜索一个特定的用户并试图跟踪他时:所以我搜索一个特定的用户,说“test”,它会按它应该显示的那样显示,但当我单击follow,然后返回到parse,查看“I”是否跟踪了test,我可以得到不同的结果

它说我遵循了第一个用户创建的“tester”这个例子。它看起来像是在跟踪单元格,现在是用户ID

之后,我设法按字母顺序获取用户,但这里的问题与此相同,只是第一个用户按字母顺序出现,例如,如果我有一个以“a”开头的用户名

我不知道如何解决这个问题,所以我希望这里有人能解决。我接受并感谢所有的提示和答案

这是我的密码:

class yahTableViewController: UITableViewController, UISearchResultsUpdating {

    var users: [PFUser] = [PFUser]()
    var followingList: [PFUser] = [PFUser]()
    var searchResults: Bool = false

    var resultSearchController = UISearchController()
    var refresher: UIRefreshControl!
    @IBOutlet var userTableView: UITableView!



    override func viewDidLoad() {
        super.viewDidLoad()

            self.resultSearchController = UISearchController(searchResultsController: nil)
            self.resultSearchController.searchResultsUpdater = self
            self.resultSearchController.hidesNavigationBarDuringPresentation = false
            self.navigationItem.titleView = resultSearchController.searchBar
            self.resultSearchController.dimsBackgroundDuringPresentation = false
            self.definesPresentationContext = true
            self.resultSearchController.searchBar.sizeToFit()
            self.resultSearchController.searchBar.barStyle = UIBarStyle.Black
            self.resultSearchController.searchBar.tintColor = UIColor.whiteColor()



            for subview in self.resultSearchController.searchBar.subviews

            {for subsubView in subview.subviews
            {if let textField = subsubView as? UITextField
            {textField.attributedPlaceholder = NSAttributedString(string: NSLocalizedString("Search", comment: ""), attributes: [NSForegroundColorAttributeName: UIColor.whiteColor()])
                textField.textColor = UIColor.whiteColor()
                }}}


            tableView.tableFooterView = UIView()
            self.tableView.separatorInset = UIEdgeInsets(top: 10, left: 15, bottom: 10, right: 15)


            refresher = UIRefreshControl()

            refresher.attributedTitle = NSAttributedString(string: "")

            refresher.addTarget(self, action: "refresh", forControlEvents: UIControlEvents.ValueChanged)

            self.tableView.addSubview(refresher)




        }





    //Function used to load the users on first view load or when the UI refresh is performed
    private func loadUsers(searchString: String){

      func refresh() {

        let query = PFUser.query()
        query!.whereKey("username", containsString: searchString )

        self.searchResults = true

    query!.findObjectsInBackgroundWithBlock { (objects, error) -> Void in

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


                // Now get the following data for the current user
                let query = PFQuery(className: "followers")
                query.whereKey("follower", equalTo: PFUser.currentUser()!)

                query.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in
                    if  (error == nil) {
                        self.followingList.removeAll(keepCapacity: false)
                        self.followingList += objects as! [PFUser]
                        self.userTableView.reloadData()
                    } else
                        if error != nil {
                        print("Error getting following: \(error) \(error!.userInfo)")
                    }
                })
                 }


            self.searchResults = false

        self.tableView.reloadData()
        self.refresher.endRefreshing()
        }}








    func searchBarSearchButtonClicked(searchBar: UISearchBar) {

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

    func searchBarCancelButtonClicked(searchBar: UISearchBar) {


        searchBar.text = ""


    }



    func updateSearchResultsForSearchController(searchController: UISearchController) {

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



    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    // MARK: - Table view data source

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

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

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

        if (self.resultSearchController.active && self.users.count > indexPath.row) {
            let userObject = users[indexPath.row]
            Cell.textLabel?.text = userObject.username

            for following in followingList {
                if following["following"] as? String == PFUser.currentUser()! {
                    //Add checkbox to cell
                    Cell.accessoryType = UITableViewCellAccessoryType.Checkmark
                    break
                }}

            // 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) {

        if let selectedUser = users[indexPath.row] as? PFUser {
            // Now get the following/following data for the current user
            let query = PFQuery(className: "Followers")
            query.whereKey("follower", equalTo: (PFUser.currentUser()?.objectId)!)
            query.whereKey("following", equalTo: (selectedUser.objectId)!)

            query.getFirstObjectInBackgroundWithBlock({ (object, error) -> Void in
                if error != nil && object == nil {
                    // Means the record doesn't exist
                    self.insertFollowingRecord(selectedUser, selectedIndexPath: indexPath)
                } else {


                    // Means record is present, so we will delete it
                    if let followingObject = object {
                        followingObject.deleteInBackground()

                        let cell:UITableViewCell = self.userTableView.cellForRowAtIndexPath(indexPath)!
                        //Remove checkbox from cell
                        cell.accessoryType = UITableViewCellAccessoryType.None
                    }
                }
            })
        }
    }

    private func insertFollowingRecord (selectedUser:PFUser, selectedIndexPath: NSIndexPath) -> Void {
        // Now add the data for following in parse
        let following:PFObject = PFObject(className: "Followers")
        following["following"] = selectedUser.objectId
        following["follower"] = PFUser.currentUser()?.objectId

        following.saveInBackgroundWithBlock({ (success, error) -> Void in
            if success {
                let cell:UITableViewCell = self.userTableView.cellForRowAtIndexPath(selectedIndexPath)!
                //Add checkbox to cell
                cell.accessoryType = UITableViewCellAccessoryType.Checkmark
            } else if error != nil {
                print("Error getting following: \(error) \(error!.userInfo)")
            }
        })
}



}

您需要实现
UISearchResultsUpdating
协议来实现这一点。它使用了一个
UISearchController
(在iOS 8中引入),它必须以编程方式添加,而不是通过故事板添加,但别担心,它非常简单

这应该能帮你完成任务

由拉塞尔提供

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
        }
    }
}