gpt4 book ai didi

ios - 搜索时关注/取消关注用户的问题?解析

转载 作者:行者123 更新时间:2023-11-30 13:44:04 26 4
gpt4 key购买 nike

下午好,

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

我创建了一个 UISearchController,从解析中加载了我的用户,以便我可以搜索单个用户,并且我添加了关注和取消关注功能。

我的问题是当我搜索特定用户并尝试关注他时:所以我搜索特定用户说“测试”,它会按预期显示,但是当我单击“关注”然后返回解析查看时如果“我”遵循了测试,我可以得到不同的结果。

它说我已经关注了例如“tester”,这是创建的第一个用户。它似乎遵循 Cell,现在又遵循 userId...

之后,我设法按字母顺序排列用户,但这里也有同样的问题,除了它按字母顺序排列在第一个用户之后,例如,如果我有一个以“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 协议(protocol)来实现此目的。它使用 UISearchController (在 iOS 8 中引入),必须以编程方式添加,而不是通过 Storyboard,但不用担心,它非常简单。

这应该可以帮你完成工作

由拉塞尔提供。

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

关于ios - 搜索时关注/取消关注用户的问题?解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35189987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com