ios - 使搜索栏通知 viewController 用户即将搜索
问题描述
我正在我的应用程序中实现搜索功能。该应用程序由一个视图控制器和一个处理搜索逻辑的自定义类组成。这个自定义类称为SearchController
.
UISearchBarDelegate
我的目标是让 searchBar 在用户即将开始搜索时通知视图控制器(与method完全相同的行为searchBarShouldBeginEditing
)。
通常,您只需searchBarShouldBeginEditing
在内部声明,SearchController
但我试图从内部调用此方法,viewController
因为我希望在此事件发生时更改视图中的某些内容(因此应该由 viewController 处理它,而不是 searchController)。
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 */
}
我省略了这两个类中的大部分,因为搜索功能已经可以使用。我唯一苦苦挣扎的事情是找到一种方法来让viewController
用户知道何时开始在搜索字段中输入内容。
我尝试制作viewController
实现UISearchBarDelegate
,但我已经在制作SearchController
实现UISearchBarDelegate
,为什么我不能访问里面的委托方法viewController
?
我希望我说清楚了,如有必要,我可以进一步澄清这篇文章。我一直在扯头发,试图自己解决这个问题。
解决方案
好的,asearchBar
不能有 2 个代表,所以你必须想办法解决这个问题。
解决此问题的一种方法是:
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
}
}
推荐阅读
- python - 带有 login_required 装饰器的 Django 3.1 异步视图
- dataweave - 需要 dataweave 帮助进行转换
- reactjs - 变量“数据”隐式具有类型“任何 []”
- c++ - 如何将 boost::intrusive_ptr 与 boost::intrusive::list 一起使用?
- python - 使用 tkinter 后 Pygame 窗口不会移动或关闭
- echarts - 使echarts xAxis不是从0开始
- c++ - 为什么 lambda 通过引用捕获仍在使用悬空引用?
- javascript - Vue 动态路由在手动导航或页面刷新时不显示内容
- c++ - 如何在编译过程中自动在 Visual Studio 中生成相应的 protobuf 文件?
- vis.js - 更改节点形状