gpt4 book ai didi

swift - UISearchResultsUpdating 不根据 searchBar 文本过滤 collectionView

转载 作者:行者123 更新时间:2023-11-30 12:09:03 26 4
gpt4 key购买 nike

我正在尝试根据 searchBar 文本输入过滤 collectionView。我能够在 textDidChange 和 updateSearchResults 函数调用上使用数据库中的所有用户加载和填充 UISearchResultsUpdating 类的 collectionView,但 collectionView 不会根据 searchBar 输入进行过滤(它始终显示数据库中的所有用户 - 即使在文本输入上) 。我认为棘手的部分是我有一个 collectionView(menuBar 类),它委托(delegate)给其他 2 个 collectionView。这些 collectionView 中的每一个都有不同的 searchBar 和 searchController。请参阅随附的屏幕截图和代码以供引用。提前致谢!

enter image description here enter image description here

//searchVC 与两个 searchControllers

class SearchVC: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout, UISearchControllerDelegate, UISearchBarDelegate {

var users = [CurrentTraveler]()
var isSearching = false
var filteredData = [CurrentTraveler]()

var peopleResultsViewController: SearchPeopleResultsVC?

var filtered:[String] = []
var searchActive : Bool = false
var searchPeopleController: UISearchController?

let cellId1 = "cellId1"
let cellId2 = "cellId2"

override func viewDidLoad() {
super.viewDidLoad()
setupSearchBar()
setupCollectionView()
}

func setupSearchBar() {
// sets up searchBar for first collectionView...
}

func setupCollectionView() {
contentCollectionView.dataSource = self
contentCollectionView.delegate = self
contentCollectionView.register(SearchPeopleCollectionView.self, forCellWithReuseIdentifier: cellId2)
}

func scrollToMenuIndex(menuIndex: Int) {
let indexPath = IndexPath(item: menuIndex, section: 0)
contentCollectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition(), animated: true)

if indexPath.item == 1 {
searchPeopleController?.delegate = self
searchPeopleController?.searchBar.delegate = self

peopleResultsViewController = SearchPeopleResultsVC()

searchPeopleController = UISearchController(searchResultsController: peopleResultsViewController)
searchPeopleController?.searchResultsUpdater = peopleResultsViewController

navigationItem.titleView = searchPeopleController?.searchBar
}

if indexPath.item == 0 {
// sets up searchController for first collectionView search
}
}

//menubar collectionView
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 2
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId1", for: indexPath)

if indexPath.item == 0 {
// set up first collectionView in menubar...
}

if indexPath.item == 1 {
let usersCell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId2", for: indexPath) as! SearchPeopleCollectionView
usersCell.searchVC = self
return usersCell
}
return cell
}

var filterString = "" {
didSet {
guard filterString != oldValue else { return }

if filterString.isEmpty {
filteredData = users
}
else {
filteredData = users.filter { ($0.name?.localizedStandardContains(filterString))! }
}
peopleResultsViewController?.collectionView.reloadData()
}
}

func updateSearchResults(for searchPeopleController: UISearchController) {
filterString = searchPeopleController.searchBar.text ?? ""

if filterString.isEmpty {
filteredData = users
}
else {
filteredData = users.filter { ($0.name?.localizedStandardContains(filterString))! }
}
peopleResultsViewController?.collectionView.reloadData()
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
// should I do anything here...?
}

}

//UISearchResultsUpdating 类

class SearchPeopleResultsVC : UIViewController, UISearchResultsUpdating, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UISearchBarDelegate {

let cellId = "cellId"

var users = [CurrentTraveler]()
var filteredData = [CurrentTraveler]()
var isSearching = false
var searchVC: SearchVC?
var peopleResultsViewController: SearchPeopleResultsVC?
var searchController: UISearchController?
var searchPeopleCollectionView: SearchPeopleCollectionView?
var filtered:[String] = []
var searchActive : Bool = false

let searchPeopleController = UISearchController(searchResultsController: nil)

lazy var collectionView: UICollectionView = {
cv.dataSource = self
cv.delegate = self
return cv
}()

override func viewDidLoad() {
collectionView.delegate = self
collectionView.dataSource = self

fetchTravelingUserCell()
}

func fetchTravelingUserCell() {
Database.database().reference().child("users").observe(.childAdded, with: { (snapshot) in

if let dictionary = snapshot.value as? [String: AnyObject] {
let user = CurrentTraveler(dictionary: dictionary)
self.users.append(user)

DispatchQueue.main.async(execute: {
self.collectionView.reloadData()
})
}
}, withCancel: nil)
}

var filterString = "" {
didSet {
// Return if the filter string hasn't changed.
guard filterString != oldValue else { return }

if filterString.isEmpty {
filteredData = users
}
else {
filteredData = users.filter { ($0.name?.localizedStandardContains(filterString))! }
}
collectionView.reloadData()
}
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
if searchPeopleController.isActive && searchPeopleController.searchBar.text != "" {
return filteredData.count
}
return users.count
}


func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as? BaseGlobalSearchUser else { fatalError("Expected to display a `DataItemCollectionViewCell`.") }

if searchPeopleController.isActive && searchPeopleController.searchBar.text != "" {
cell.currentTraveler = filteredData[indexPath.item]
} else {
cell.currentTraveler = users[indexPath.item]
}
return cell
}

func updateSearchResults(for searchPeopleController: UISearchController) {
filterString = searchPeopleController.searchBar.text ?? ""
// does print what user types in the searchBar
print(filterString)

if filterString.isEmpty {
filteredData = users
}
else {
filteredData = users.filter { ($0.name?.localizedStandardContains(filterString))! }
}
peopleResultsViewController?.collectionView.reloadData()
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if filterString.isEmpty {
filteredData = users
}
else {
filteredData = users.filter { ($0.name?.localizedStandardContains(filterString))! }
}
self.collectionView.reloadData()
}

}

//数据模型类

class CurrentTraveler: SafeJsonObject {

var name: String?
var profileImageUrl: String?
var travelingPlace: String?

init(dictionary: [String: AnyObject]) {
super.init()

self.name = dictionary["name"] as? String
self.profileImageUrl = dictionary["profileImageUrl"] as? String
self.travelingPlace = dictionary["users/uid/Places"] as? String
setValuesForKeys(dictionary)
}
}

最佳答案

可能您的filteredString为空。所以你没有获得值(value)。

所以尝试如下:

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
if filterString.isEmpty {
filterString = searchText
}
if filterString.isEmpty {
filteredData = users
} else {
filteredData = users.filter { ($0.name?.localizedStandardContains(filterString))! }
}
self.collectionView.reloadData()
}

关于swift - UISearchResultsUpdating 不根据 searchBar 文本过滤 collectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46290560/

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