代码之家  ›  专栏  ›  技术社区  ›  David Henry

CellForRowatindex未被调用

  •  0
  • David Henry  · 技术社区  · 7 年前

    我将在 ViewController 作为一个 UISearchController 谷歌自动完成。然而, cellForRowAtIndex 没有被调用,断点什么也不做。

    我检查过的;

    • 数据源设置为自身
    • 委托设置为自身
    • 数据正在控制台中打印出来
    • 我有所有委托和数据源方法

    但是,当我用 ui搜索控制器 与主管道相同 可视控制器 它工作得很好。这可以作为 ui搜索控制器 是不同的 可视控制器 ?

    有什么想法吗?非常感谢您的帮助。-代码如下;

    地图控制器

    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
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   vadian    7 年前

    您使用的是 ResultsController 因为默认初始值设定项的每个调用 ResultsController() 创建新实例。

    解决方法是声明 searchController 懒洋洋地

    private lazy var searchController : UISearchController = { 
        return UISearchController(searchResultsController: resultsController) 
    }()
    
    推荐文章