gpt4 book ai didi

swift - 搜索字段和表格 View - 仅显示用户名大写的用户

转载 作者:行者123 更新时间:2023-11-30 10:54:10 24 4
gpt4 key购买 nike

我的应用程序中有一个搜索字段,用户可以在其中搜索其他用户。但是我有三个问题:

  1. 目前,搜索仅适用于用户名大写的用户。例如,当我搜索“Ma”时,显示的唯一用户是“Makelele”,因为他的用户名的第一个字母是大写字母。例如,“mattgilbert”根本没有显示,即使我应该在桌面 View 上。

  2. 当用户出现在 TableView 中时,即使我取消了搜索,用户仍然在 TableView 中。

  3. 我拥有它,因此仅当用户输入至少 2 个单词时才开始搜索用户,但是如果用户在搜索字段中输入的单词超过该数量,则用户将消失在表格 View 中。我必须搜索更多字母才能让用户再次出现。

如果有人能帮助我解决这个问题,那就意义重大了,因为我在这个搜索上花了很多时间。我希望它尽可能具有成本效益,同时可扩展(因此为什么我在数据库运行查询之前至少输入这两个字母)

这是我的代码:

class FollowUsersTableViewController: UIViewController {

@IBOutlet var tableView: UITableView!

var isSearching = false

private var viewIsHiddenObserver: NSKeyValueObservation?
let searchController = UISearchController(searchResultsController: nil)
var usersArray = [UserModel]()
var filteredUsers = [UserModel]()
var loggedInUser: User?
//
var databaseRef = Database.database().reference()
//usikker på den koden over

override func viewDidLoad() {

super.viewDidLoad()

searchController.searchBar.delegate = self


//large title
self.title = "Discover"
if #available(iOS 11.0, *) {
self.navigationController?.navigationBar.prefersLargeTitles = true
} else {
// Fallback on earlier versions
}

self.tableView?.delegate = self
self.tableView?.dataSource = self
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
self.searchController.delegate = self;



definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar

//self.loadProfileData()

//self.searchBar(searchController.searchBar, textDidChange: searchController.searchBar.text)







}





func searchUsers(text: String) {
if text.count >= 2 {
self.usersArray = [] //clear the array each time
let endingText = text + "\u{f8ff}"
databaseRef.child("profile").queryOrdered(byChild: "username")
.queryStarting(atValue: text)
.queryEnding(atValue: endingText)
.observeSingleEvent(of: .value, with: { snapshot in

for child in snapshot.children {
let childSnap = child as! DataSnapshot
print(childSnap)
let userObj = Mapper<UserModel>().map(JSONObject: childSnap.value!)
userObj?.uid = childSnap.key
if childSnap.key != self.loggedInUser?.uid { //ignore this user
self.usersArray.append(userObj!)

}
}
self.tableView.reloadData()
})
}
} //may need an else statement here to clear the array when there is no text


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let dest = segue.destination as! UserProfileViewController
let obj = sender as! UserModel
let dict = ["uid": obj.uid!, "username": obj.username!, "photoURL": obj.photoURL, "bio": obj.bio]
dest.selectedUser = dict as [String : Any]
}





}

// MARK: - tableview methods
extension FollowUsersTableViewController: UITableViewDataSource, UITableViewDelegate {



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return isSearching ? filteredUsers.count : usersArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! FollowTableViewCell

let user = isSearching ? filteredUsers[indexPath.row] : usersArray[indexPath.row]

cell.title?.text = user.username
if let url = URL(string: user.photoURL ?? "") {
cell.userImage?.sd_setImage(with: url, placeholderImage: #imageLiteral(resourceName: "user_male"), options: .progressiveDownload, completed: nil)
cell.userImage.sd_setIndicatorStyle(.gray)
cell.userImage.sd_showActivityIndicatorView()
}

return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 50
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "user", sender: isSearching ? self.filteredUsers[indexPath.row] : self.usersArray[indexPath.row])
}



}

// MARK: - search methods
extension FollowUsersTableViewController:UISearchResultsUpdating, UISearchControllerDelegate, UISearchBarDelegate {



func updateSearchResults(for searchController: UISearchController) {
searchController.searchResultsController?.view.isHidden = false

self.searchUsers(text: self.searchController.searchBar.text!)

filterContent(searchText: self.searchController.searchBar.text!)

self.tableView.reloadData()
}

func filterContent(searchText:String){

if searchText.count >= 2{


self.filteredUsers = self.usersArray.filter{ user in
return(user.username!.lowercased().contains(searchText.lowercased()))
}
}
}


func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
isSearching = true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
isSearching = false
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
isSearching = false
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
isSearching = false
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

self.filteredUsers = self.usersArray.filter{ user in
return(user.username!.lowercased().contains(searchText.lowercased()))
}


if(filteredUsers.count == 0){
isSearching = false
} else {
isSearching = true
}
self.tableView.reloadData()
}


}

编辑:更新代码

class FollowUsersTableViewController: UIViewController {

@IBOutlet var tableView: UITableView!

var isSearching = false

private var viewIsHiddenObserver: NSKeyValueObservation?
let searchController = UISearchController(searchResultsController: nil)
var usersArray = [UserModel]()

var loggedInUser: User?
//
var databaseRef = Database.database().reference()
//usikker på den koden over

override func viewDidLoad() {

super.viewDidLoad()

searchController.searchBar.delegate = self


//large title
self.title = "Discover"
if #available(iOS 11.0, *) {
self.navigationController?.navigationBar.prefersLargeTitles = true
} else {
// Fallback on earlier versions
}

self.tableView?.delegate = self
self.tableView?.dataSource = self
searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false
self.searchController.delegate = self;



definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar

//self.loadProfileData()

//self.searchBar(searchController.searchBar, textDidChange: searchController.searchBar.text)



}


func searchUsers(text: String) {
if text.count >= 2 {
self.usersArray = [] //clear the array each time
let endingText = text + "\u{f8ff}"
databaseRef.child("profile").queryOrdered(byChild: "username")
.queryStarting(atValue: text)
.queryEnding(atValue: endingText)
.observeSingleEvent(of: .value, with: { snapshot in

for child in snapshot.children {
let childSnap = child as! DataSnapshot
print(childSnap)
let userObj = Mapper<UserModel>().map(JSONObject: childSnap.value!)
userObj?.uid = childSnap.key
if childSnap.key != self.loggedInUser?.uid { //ignore this user
self.usersArray.append(userObj!)

}
}
self.tableView.reloadData()
})
}
} //may need an else statement here to clear the array when there is no text


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
let dest = segue.destination as! UserProfileViewController
let obj = sender as! UserModel
let dict = ["uid": obj.uid!, "username": obj.username!, "photoURL": obj.photoURL, "bio": obj.bio]
dest.selectedUser = dict as [String : Any]
}





}

// MARK: - tableview methods
extension FollowUsersTableViewController: UITableViewDataSource, UITableViewDelegate {



func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return usersArray.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! FollowTableViewCell

let user = usersArray[indexPath.row]

cell.title?.text = user.username
if let url = URL(string: user.photoURL ?? "") {
cell.userImage?.sd_setImage(with: url, placeholderImage: #imageLiteral(resourceName: "user_male"), options: .progressiveDownload, completed: nil)
cell.userImage.sd_setIndicatorStyle(.gray)
cell.userImage.sd_showActivityIndicatorView()
}

return cell
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 50
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "user", sender: self.usersArray[indexPath.row])
}



}

// MARK: - search methods
extension FollowUsersTableViewController:UISearchResultsUpdating, UISearchControllerDelegate, UISearchBarDelegate {



func updateSearchResults(for searchController: UISearchController) {
searchController.searchResultsController?.view.isHidden = false

self.searchUsers(text: self.searchController.searchBar.text!)

//filterContent(searchText: self.searchController.searchBar.text!)

self.tableView.reloadData()
}
/*
func filterContent(searchText:String){

if searchText.count >= 2{


self.filteredUsers = self.usersArray.filter{ user in
return(user.username!.lowercased().contains(searchText.lowercased()))
}
}
}
*/

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
isSearching = true
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
isSearching = false
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {


isSearching = false

self.usersArray = []

self.tableView.reloadData()
}

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
isSearching = false
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {

self.usersArray.filter{ user in
return(user.username!.lowercased().contains(searchText.lowercased()))
}


if(usersArray.count == 0){
isSearching = false
} else {
isSearching = true
}
self.tableView.reloadData()
}


}

最佳答案

请尝试一下,它可能对您有帮助。

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
let filteredArray = usersArray.filter { ($0["username"] as! String).range(of: searchText!, options: [.diacriticInsensitive, .caseInsensitive]) != nil }
}

也许对你有帮助,谢谢

关于swift - 搜索字段和表格 View - 仅显示用户名大写的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54146388/

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