- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试根据 searchBar 文本输入过滤 collectionView。我能够在 textDidChange 和 updateSearchResults 函数调用上使用数据库中的所有用户加载和填充 UISearchResultsUpdating 类的 collectionView,但 collectionView 不会根据 searchBar 输入进行过滤(它始终显示数据库中的所有用户 - 即使在文本输入上) 。我认为棘手的部分是我有一个 collectionView(menuBar 类),它委托(delegate)给其他 2 个 collectionView。这些 collectionView 中的每一个都有不同的 searchBar 和 searchController。请参阅随附的屏幕截图和代码以供引用。提前致谢!
//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/
好吧,我有一个 UITableViewController 并创建了一个 SearchViewController 来搜索我所做的一系列投资。投资显示在 UITableView 中(按字母顺序排列),
在这个 UITableViewController 中,我有一个这样的结构数组: struct UserItem { let key: String! let displayName: String!
我正在构建一个 UISearchController,用户将在其中键入用户名,应用程序将从 Web 服务获取结果。 我想在用户输入时限制请求以减少网络调用。使用 ReactiveCocoa 如何实现这
我有一个非常大的数据数组,我使用搜索栏来过滤它们。但是,我想仅过滤用户在搜索栏中输入的内容。 IE。如果您输入“b”,您只会获得以 b 开头的项目。该列表包含超过 200,000 个项目,因此现在即使
当我开始在搜索栏上输入时,我没有通过我的协议(protocol)收到任何数据。我的目标是在搜索 Controller 中的搜索栏上开始输入时获取数据。 代码: class FirstViewContr
我收到的错误是类型“LocationSearchTable”不符合协议(protocol)“UISearchResultsUpdating”。这个问题的大部分答案都是在代码中加上这个: func up
我有一个 TableView ,它加载函数并在 viewDidAppear 中显示数据。当用户点击导航标题中的搜索栏并搜索查询时,会使用相同的表格 View (我假设)。 问题是用户点击取消按钮后:调
我正在尝试根据 searchBar 文本输入过滤 collectionView。我能够在 textDidChange 和 updateSearchResults 函数调用上使用数据库中的所有用户加载和
我想设置一个 tableView 来搜索我需要的单元格,但是有一个问题。首先,我使用名为 UISearchDisplayController 的协议(protocol),但 Xcode 警告在 IOS
我对 UISearchBar 有疑问。当我结合 UITableView 搜索一些文本,并点击一个结果单元格时,UISearchBar 在下一个 View Controller 中仍然可见。如果我回去(
UISearchBar 有问题。当我结合 UITableView 搜索一些文本,并单击一个结果单元格时,UISearchBar 在下一个 UIViewController 中仍然可见。 UISearc
我有一个 UITableViewController 类,我在其中实现了一个 UISearchController。我添加了以下代表: class EmployeesTableView: UITabl
我是一名优秀的程序员,十分优秀!