cellForRowAtIndex 没有被调用
cellForRowAtIndex not getting called
我将 ViewController
中的 UITableView 填充为具有 Google 自动完成功能的 UISearchController
。但是,cellForRowAtIndex
没有被调用断点什么都不做。
我查过的;
- 数据源设置为自身
- 委托设置为自己
- 正在控制台打印数据
- 我有所有委托和数据源方法
虽然,当我使用 UISearchController
实现与主 ViewController
相同的代码时,它工作正常。这可能是因为 UISearchController
是不同的 ViewController
?
有什么想法吗?非常感谢任何帮助。- 下面的代码;
地图控制器
class MapController: UIViewController {
private let resultsController = ResultsController()
private let searchController = UISearchController(searchResultsController: ResultsController())
private let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
GoogleMapsService.shared.configureMapView(to: self)
GoogleMapsService.shared.googleMapsView.delegate = self
configureNavigationController()
edgesForExtendedLayout = []
definesPresentationContext = true
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
configureLocationManager()
}
func configureNavigationController() {
guard let navigationController = navigationController else { return }
navigationController.navigationBar.isTranslucent = false
navigationController.navigationBar.barTintColor = .white
navigationItem.titleView = searchController.searchBar
searchController.delegate = resultsController
searchController.searchResultsUpdater = resultsController
searchController.configureSearchController()
}
}
结果控制器
class ResultsController: UIViewController {
private let tableView = UITableView()
private let searchResultsCellIdentifier = "searchResultsCellIdentifier"
private var gmsPlacesClient = GMSPlacesClient()
private var searchResults = [GMSAutocompletePrediction]()
lazy var filteredResults: GMSAutocompleteFilter = {
let filteredResults = GMSAutocompleteFilter()
filteredResults.type = .address
return filteredResults
}()
override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
}
func configureTableView() {
tableView.delegate = self
tableView.dataSource = self
view.addSubview(tableView)
tableView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor,
paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0,
width: 0, height: 0)
tableView.tableFooterView = UIView()
tableView.register(ResultsCell.self, forCellReuseIdentifier: searchResultsCellIdentifier)
tableView.keyboardDismissMode = .interactive
tableView.backgroundColor = UIColor(red: 242/255, green: 242/255, blue: 243/255, alpha: 1)
}
}
extension ResultsController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResults.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let searchResultsCell = tableView.dequeueReusableCell(withIdentifier: searchResultsCellIdentifier, for: indexPath) as! ResultsCell
let result = searchResults[indexPath.row]
searchResultsCell.result = result
return searchResultsCell
}
}
您正在使用 ResultsController
的两个不同实例,因为每次调用默认初始化程序 ResultsController()
都会创建一个新实例。
一个解决方案是延迟声明searchController
。
private lazy var searchController : UISearchController = {
return UISearchController(searchResultsController: resultsController)
}()
我将 ViewController
中的 UITableView 填充为具有 Google 自动完成功能的 UISearchController
。但是,cellForRowAtIndex
没有被调用断点什么都不做。
我查过的;
- 数据源设置为自身
- 委托设置为自己
- 正在控制台打印数据
- 我有所有委托和数据源方法
虽然,当我使用 UISearchController
实现与主 ViewController
相同的代码时,它工作正常。这可能是因为 UISearchController
是不同的 ViewController
?
有什么想法吗?非常感谢任何帮助。- 下面的代码;
地图控制器
class MapController: UIViewController {
private let resultsController = ResultsController()
private let searchController = UISearchController(searchResultsController: ResultsController())
private let locationManager = CLLocationManager()
override func viewDidLoad() {
super.viewDidLoad()
GoogleMapsService.shared.configureMapView(to: self)
GoogleMapsService.shared.googleMapsView.delegate = self
configureNavigationController()
edgesForExtendedLayout = []
definesPresentationContext = true
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
configureLocationManager()
}
func configureNavigationController() {
guard let navigationController = navigationController else { return }
navigationController.navigationBar.isTranslucent = false
navigationController.navigationBar.barTintColor = .white
navigationItem.titleView = searchController.searchBar
searchController.delegate = resultsController
searchController.searchResultsUpdater = resultsController
searchController.configureSearchController()
}
}
结果控制器
class ResultsController: UIViewController {
private let tableView = UITableView()
private let searchResultsCellIdentifier = "searchResultsCellIdentifier"
private var gmsPlacesClient = GMSPlacesClient()
private var searchResults = [GMSAutocompletePrediction]()
lazy var filteredResults: GMSAutocompleteFilter = {
let filteredResults = GMSAutocompleteFilter()
filteredResults.type = .address
return filteredResults
}()
override func viewDidLoad() {
super.viewDidLoad()
configureTableView()
}
func configureTableView() {
tableView.delegate = self
tableView.dataSource = self
view.addSubview(tableView)
tableView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor,
paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0,
width: 0, height: 0)
tableView.tableFooterView = UIView()
tableView.register(ResultsCell.self, forCellReuseIdentifier: searchResultsCellIdentifier)
tableView.keyboardDismissMode = .interactive
tableView.backgroundColor = UIColor(red: 242/255, green: 242/255, blue: 243/255, alpha: 1)
}
}
extension ResultsController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return searchResults.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let searchResultsCell = tableView.dequeueReusableCell(withIdentifier: searchResultsCellIdentifier, for: indexPath) as! ResultsCell
let result = searchResults[indexPath.row]
searchResultsCell.result = result
return searchResultsCell
}
}
您正在使用 ResultsController
的两个不同实例,因为每次调用默认初始化程序 ResultsController()
都会创建一个新实例。
一个解决方案是延迟声明searchController
。
private lazy var searchController : UISearchController = {
return UISearchController(searchResultsController: resultsController)
}()