未能使用 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 中设计的——很明显——你不需要注册单元格,也不需要以编程方式设置delegate
和datasource
。
【参考方案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 declaration
和 consecutive 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 中的单元格数