UISearchResultsUpdating 不符合视图控制器中的扩展类
Posted
技术标签:
【中文标题】UISearchResultsUpdating 不符合视图控制器中的扩展类【英文标题】:UISearchResultsUpdating not conforming to extension class in view controller 【发布时间】:2020-01-21 16:13:04 【问题描述】:我正在尝试获取类似 instagrams 探索页面的内容,例如 here(图片太大,无法添加到帖子中)。我有一个 explore viewController,顶部有一个搜索栏,搜索栏下方有一个内容的集合视图,每当用户单击搜索栏时,它都会转到我的搜索表视图控制器类,该类为他们提供用户的结果匹配他们的查询,反之亦然。
这是我的普通搜索视图控制器(显示内容的主要控制器):
import UIKit
class SearchViewController: UIViewController
@IBOutlet weak var searchBar: UISearchBar!
override func viewDidLoad()
super.viewDidLoad()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
guard let SearchResultsViewController = storyboard.instantiateViewController(withIdentifier: "SearchResultsViewController") as? SearchTableViewController else return
let searchController = UISearchController(searchResultsController: SearchResultsViewController)
searchController.searchResultsUpdater = SearchTableViewController // ERROR HERE
view.addSubview(searchController.searchBar)
definesPresentationContext = true
这是我的搜索表视图控制器:
class SearchTableViewController: UIViewController
let languages = ["Mandarin Chinese", "English", "Hindustani", "Spanish", "Arabic", "Malay", "Russian", "Bengali", "Portuguese", "French", "Hausa", "Punjabi", "German", "Japanese", "Persian", "Swahili", "Telugu", "Javanese", "Wu Chinese", "Korean"]
var searchResults: [String] = []
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad()
super.viewDidLoad()
tableView.dataSource = self
extension SearchTableViewController: UISearchResultsUpdating
func updateSearchResults(for searchController: UISearchController)
guard let searchText = searchController.searchBar.text else return
searchResults = languages.filter $0.contains(searchText)
tableView.reloadData()
extension SearchTableViewController: UITableViewDataSource
func numberOfSections(in tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return searchResults.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell", for: indexPath)
let language = searchResults[indexPath.row]
cell.textLabel?.text = language
return cell
目前我一直坚持调用searchResultsUpdating
课程。错误为Cannot assign value of type 'SearchTableViewController.Type' to type 'UISearchResultsUpdating?'
。我的SearchTableViewController
在类的扩展中有UISearchResultsUpdating
代表,我不知道我哪里出错了?我正在尝试通过这种设计实现类似Pete's answer 的目标:
显然没有标签导航栏。
【问题讨论】:
【参考方案1】:您不需要SearchTableViewController
的实例吗?
您正在尝试在此处分配类类型而不是它的实例:
searchController.searchResultsUpdater = SearchTableViewController
您需要初始化 SearchTableViewcontroller 或引用它的实例以设置为searchResultsUpdater
【讨论】:
是的......这是一个很好的观点。这让我意识到我引用了错误的实例,我需要引用我创建的guard let SearchResultsViewController = storyboard.instantiateViewController(withIdentifier: "SearchResultsViewController") as? SearchTableViewController else return
变量,而不是实际的故事板本身,哈哈。我会将其标记为技术上的答案。谢谢!
是的,有时很容易忽略并深入研究以找到解决方案:D
只需要一双新鲜的眼睛来认识愚蠢的错误以上是关于UISearchResultsUpdating 不符合视图控制器中的扩展类的主要内容,如果未能解决你的问题,请参考以下文章
如何使 UITableViewController 符合协议 UISearchResultsUpdating?
为啥使用 UISearchResultsUpdating 取消按钮后我的 tableview 是空白的?
Swift:如何对数组中结构的子值使用 UISearchResultsUpdating?