未能使用 swift 3 从其数据源中获取单元格

Posted

技术标签:

【中文标题】未能使用 swift 3 从其数据源中获取单元格【英文标题】:failed to obtain a cell from its dataSource with swift 3 【发布时间】:2016-10-20 14:51:36 【问题描述】:

我将以下 UITableViewController 作为 searchResultsController 附加:

import UIKit
import MapKit

class LocationSearchTable : UITableViewController 
    var matchingItems:[MKMapItem] = []
    var mapView: MKMapView? = nil

    override func viewDidLoad() 
        super.viewDidLoad()

        tableView.dataSource = self
        tableView.delegate = self
    


extension LocationSearchTable : UISearchResultsUpdating 
    func updateSearchResults(for searchController: UISearchController)
        guard let mapView = mapView,
            let searchBarText = searchController.searchBar.text else  return 
        let request = MKLocalSearchRequest()
        request.naturalLanguageQuery = searchBarText
        request.region = mapView.region
        let search = MKLocalSearch(request: request)
        search.start  response, _ in
            guard let response = response else 
                return
            
            self.matchingItems = response.mapItems
            self.tableView.reloadData()
        
    



extension LocationSearchTable 
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        print(matchingItems.count)
        return matchingItems.count
    

     func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!
        let selectedItem = matchingItems[indexPath.row].placemark
        cell.textLabel?.text = selectedItem.name
        cell.detailTextLabel?.text = ""
        return cell
    

这里崩溃了一次 matchingItems.count 不等于 0 例如:

0 0 10 2016-10-20 15:43:53.914 ios-App[9137:977735] * 断言 -[UITableView _configureCellForDisplay:forIndexPath:] 中的失败, /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3599.6/UITableView.m:8035 2016-10-20 15:43:53.927 ios-App[9137:977735] * 终止应用程序到期 未捕获的异常“NSInternalInconsistencyException”,原因: 'UITableView (; layer = ; contentOffset: 0, -64; contentSize: 768, 440>) 未能从其数据源中获取单元格

当我在 cellForRowAtIndexPath 中添加调试点时,它们从未到达,应用似乎在此之前崩溃?

【问题讨论】:

需要检查的几件事: 1) 确保表视图的数据源正确设置为视图控制器。 2) 确保您已在表格视图中注册了您的单元格,以便它们可以正确出列。 谢谢@dlbuckley 我已经更新了问题 @dlbuckley 如果UITableViewController 是在Interface Builder 中设计的——很明显——你不需要注册单元格,也不需要以编程方式设置delegatedatasource 【参考方案1】:

错误

未能从其数据源获取单元格

因为cellForRowAtIndexPath 的签名错误而发生。在 Swift 3 中是

(override) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

并使用方便的方法

let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for:indexPath)

它总是返回一个有效的非可选单元格。


PS:您不需要设置数据源并委托给self,因为UITableViewController 会隐式执行此操作

【讨论】:

另一个问题。对dequeueReusableCell 的调用可以返回nil (override) func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 给我一个错误(expected declarationconsecutive declarations must be separated by ';')。 Xcode 8.1。 @afkatja 我把override 放在括号里。如果目标类是UITableViewController,则需要override,如果目标类是UIViewController,则不需要。删除括号并遵循编译器的建议,如果有的话。【参考方案2】:

我有类似的问题!经过几分钟的调试,我意识到我没有继承

UITableViewDelegate、UITableViewDataSource

在我的 ViewController 上。

【讨论】:

以上是关于未能使用 swift 3 从其数据源中获取单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Alamofire,Swift 4 为 UICollectionView 获取 JSON 数据

使用 Parse 获取 UITableView 中的单元格数

使用 Table 加载 UIView 时无法从其 dataSource 中获取单元格

数据未能通过

UITableview:无法从其数据源获取单元格

带有多个自定义单元格的“UITableView 无法从其数据源获取单元格”