Swift 中的 UiSearchBar 到 UiCollectionView

dev012

我在屏幕顶部有 2 个标签。每个页面都包含 collectionView。我必须在 collectionView 的顶部创建一个 searchBar。我希望它看起来像在设置应用程序中(向下滚动时出现,向上滚动时消失)。这是我用于搜索组件的代码。但是由于我在页面内没有导航栏,所以它没有显示。

请帮助我在 tabBar 和 collectionView 之间进行搜索。

    import UIKit

    class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UISearchControllerDelegate, UISearchBarDelegate, UISearchResultsUpdating {

    var filtered:[String] = []
    var searchActive : Bool = false
    let searchController = UISearchController(searchResultsController: nil)

    @IBOutlet weak var collectionView: UICollectionView!

    var items = ["Apple", "Orange", "Apple", "Orange", "Apple", "Orange", "Apple", "Orange", "Apple", "Orange", "Apple", "Orange"]

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView.delegate = self
        collectionView.dataSource = self

        self.searchController.searchResultsUpdater = self
        self.searchController.delegate = self
        self.searchController.searchBar.delegate = self
        self.searchController.hidesNavigationBarDuringPresentation = false
        self.searchController.dimsBackgroundDuringPresentation = true
        self.searchController.obscuresBackgroundDuringPresentation = false
        searchController.searchBar.placeholder = "Search..."
        searchController.searchBar.sizeToFit()
        searchController.searchBar.becomeFirstResponder()
        self.navigationItem.titleView = searchController.searchBar

        self.definesPresentationContext = true
        self.searchController.searchBar.placeholder = "Search for Items"

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

            if searchActive {
                return filtered.count
            }
            else
            {
                return items.count
            }
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CollectionViewCell

        cell.contentView.layer.cornerRadius = 7.0
        cell.contentView.layer.borderWidth = 1.0
        cell.contentView.layer.borderColor = UIColor.clear.cgColor
        cell.contentView.layer.masksToBounds = false
        cell.layer.cornerRadius = 7.0

        return cell
    }

    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        searchActive = false
        self.dismiss(animated: true, completion: nil)
    }

    func updateSearchResults(for searchController: UISearchController)
    {
        let searchString = searchController.searchBar.text

        filtered = items.filter({ (item) -> Bool in
            let countryText: NSString = item as NSString

            return (countryText.range(of: searchString!, options: NSString.CompareOptions.caseInsensitive).location) != NSNotFound
        })

        collectionView.reloadData()
    }

    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        searchActive = true
        collectionView.reloadData()
    }

    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        searchActive = false
        collectionView.reloadData()
    }

    func searchBarBookmarkButtonClicked(_ searchBar: UISearchBar) {
        if !searchActive {
            searchActive = true
            collectionView.reloadData()
        }

        searchController.searchBar.resignFirstResponder()
    }
}
艾苏丹·阿斯卡洛夫

我也遇到了同样的问题,创建 UISerchBar 而不是 UISearchController 是实现目标的最佳方式。

这是将 UISearchBar 设置为与 UISearchBarController 完全一样功能的示例:

设置搜索栏

let searchBar: UISearchBar = {
       
        let searchBar = UISearchBar()
        searchBar.tintColor = UIColor.black.withAlphaComponent(1.0)
        searchBar.placeholder = "Search for exercise"
        searchBar.backgroundColor = UIColor.clear
        searchBar.barTintColor = UIColor.clear
        searchBar.searchBarStyle = .minimal
        searchBar.returnKeyType = .search
        searchBar.showsCancelButton = false
        searchBar.showsBookmarkButton = false
        searchBar.sizeToFit()
        
        return searchBar
    }()

设置它的委托,也不要忘记将definePresentationContext设置为false,否则searchBar不会出现

searchBar.delegate = self self.definesPresentationContext = false

searchBar 的自定义函数 这里我们设置 SearchBar 的行为

extension YourViewController: UISearchBarDelegate {
    
    func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
        searchActive = true
        self.searchBar.showsCancelButton = true
        self.collectionView.reloadData()
    }
    
    func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
        self.searchBar.text = ""
        self.filtered = []
        searchActive = false
        self.searchBar.showsCancelButton = false
        self.searchBar.endEditing(true)
        self.dismiss(animated: true, completion: nil)
        self.collectionView.reloadData()
    }
    
    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        
        if searchBar.text! == " "  {
            filtered = exercises
            collectionView.reloadData()
        } else {
        
        filtered = exercises.filter({ (item) -> Bool in
            
            return (item.exerciseNameLabel?.localizedCaseInsensitiveContains(String(searchBar.text!)))!
            
            })
        
        collectionView.reloadData()
        }
        
    }
    
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        collectionView.reloadData()
    }
    
}

我希望它能帮助你解决你的问题:)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Swift中隐藏UISearchBar

Swift-UIToolbar中的UISearchBar

嵌入到NavigationItem中的UISearchBar动画损坏

Swift:UISearchBar 中字典的多个结果

在Swift 4中使用UItextfield的UISearchbar

Swift UIRefreshControl 到 UICollectionView 内的 UIScrollView

Swift UITableView / UICollectionVIew将数据传递到cellForRowAt中的单元格返回nil

从Swift中的UICollectionView进行Segue

Swift中的UICollectionView节边框

嵌入到UINavigationBar中时,UISearchBar的宽度不会改变

UISearchbar 在 swift 3 中的所有字段中搜索

在 Swift 中的 UITableViewController 中显示 UICollectionView

如何在Swift中通过动作显示/隐藏UISearchBar?

如何在Swift中更改UISearchBar上的“取消”按钮的颜色

如何使UITextField像Swift中的UISearchBar一样工作?

如何清除iOS10 Swift中的UISearchBar背景颜色?

UISearchbar并在View Controller XCode Swift中传递数据

Swift中UICollectionView的单元格registerClass

如何使用Swift在uicollectionview中添加阴影?

UICollectionView中的IBOutlets为零-Swift

Swift 中特定部分的 UICollectionView 粘性标题

UICollectionView DidDeselectItemAtIndexPath 方法未在 Swift 中调用

如何在 swift 中从 UICollectionView 呈现 activityViewController

尝试将 Unsplash 中的图片显示到 UICollectionView 中

在 Swift 中以编程方式在 UITableViewCell 中创建 UICollectionView

在Swift中可以在单个UICollectionView中制作两个具有多个内容的UICollectionView吗?

UIViewController中的UISearchBar崩溃

UINavigationController 中的 UISearchBar

NavigationBar中的UISearchBar颜色