代码之家  ›  专栏  ›  技术社区  ›  Swifty

使搜索栏通知viewController用户将要搜索

  •  0
  • Swifty  · 技术社区  · 8 年前

    我正在我的应用程序中实现搜索功能。该应用程序由一个视图控制器和一个处理搜索逻辑的自定义类组成。此自定义类称为 SearchController

    UISearchBarDelegate 方法 searchBarShouldBeginEditing ).

    搜索栏应开始编辑 里面 但是我试着从内部调用这个方法 viewController 因为我希望在发生此事件时视图中的某些内容发生更改(因此应该由viewController而不是searchController来处理)。

    班级:

    class SearchController: NSObject, UISearchBarDelegate {
    
        let searchBar = UISearchBar()
        var searchButton = UIBarButtonItem? = nil
    
        /* Other irrelevant class properties */
    
        func setup() {
            searchBar.delegate = self
            /* other setup */
        }
    }
    

    ViewController 班级:

    class ViewController: UIViewController {
    
        private let searchController = SearchController()  
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            searchController.delegate = self
            searchController.setup()
        }
    
        /* setup a tableview to display results... this part of the implementation works fine */
    }
    

    视图控制器

    我试着 实施 但我已经做了 实施 UISearchBarDelegate公司 为什么我不能访问里面的委托方法呢 视图控制器 ?

    我希望我自己说清楚,我可以进一步澄清这个职位,如果必要的话。我一直在绞尽脑汁想自己解决这个问题。

    2 回复  |  直到 8 年前
        1
  •  2
  •   Sam Peters    8 年前

    好的,a searchBar

    一种方法是:

    protocol SearchControllerDelegate: class{
        func searchBarDidBeginEditing()
    }
    
    class SearchController: NSObject, UISearchBarDelegate {
    
        weak var delegate: SearchControllerDelegate?
    
        private let searchBar = UISearchBar()
    
        func setup() {
            searchBar.delegate = self
        }
    
        func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
            delegate?.searchBarDidBeginEditing()
        }
    
    }
    
    class ViewController: UIViewController, SearchControllerDelegate{
    
        var searchController = SearchController()
        func setUP(){
            self.searchController.delegate = self
        }
    
        func searchBarDidBeginEditing() {
            /// perform some action here
        }
    
    }
    
        2
  •  1
  •   thy.nguyen    8 年前

    你可以用 UISearchController UISearchResultsUpdating

    视图控制器

     class ViewController: UIViewController, UISearchResultsUpdating {
        private let searchController = UISearchController(searchResultsController:  nil) 
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            searchController.searchResultsUpdater = self
            searchController.delegate = self
    
            ....
        }
    
        // Called when the search bar's text or scope has changed or when the search bar becomes first responder.
        func updateSearchResults(for searchController: UISearchController) {
            //Do something...
        }
    }
    

    或者,如果您真的想自己实现搜索栏逻辑,可以使用闭包:

    搜索控制器

    class SearchController: NSObject, UISearchBarDelegate {
    
        let searchBar = UISearchBar()
        var searchButton = UIBarButtonItem? = nil
        var didBeginSearching: (() -> ())?
    
        /* Other irrelevant class properties */
    
        func setup() {
            searchBar.delegate = self
            /* other setup */
        }
    
        func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
            didBeginSearching?()
        }
    }
    

    视图控制器 班级:

    class ViewController: UIViewController {
    
        private let searchController = SearchController() 
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            searchController.setup()
            searchController.didBeginSearching = { [weak self] in
                //Do something...
            }
        }
    }