以下行崩溃了该程序:
let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell",forIndexPath: NSIndexPath(forRow: 0,inSection: 0)) as! ItemCell
控制台日志显示以下错误:
"caught "NSInternalInconsistencyException","request for rect at invalid index path (<NSIndexPath: 0xc000000000000016> {length = 2,path = 0 - 0})"
这是我检查过的一些项目清单:
>身份检查器中列出了正确的故事板ID
>身份检查器中列出了正确的自定义类
>属性检查器在“表视图单元标识符”字段中具有“ItemCell”
这是完整的代码:
import XCTest
@testable import Todo
class ItemCellTests: XCTestCase {
override func setUp() {
super.setUp()
// Put setup code here. This method is called before the invocation of each test method in the class.
}
override func tearDown() {
// Put teardown code here. This method is called after the invocation of each test method in the class.
super.tearDown()
}
func testSUT_HasNameLabel(){
let storyboard = UIStoryboard(name: "Main",bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("ItemListViewController") as! ItemListViewController
_=controller.view
let tableView = controller.tableView
tableView.dataSource = FakeDataSource()
let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell",inSection: 0)) as! ItemCell
XCTAssertNotNil(cell.titleLabel)
}
}
extension ItemCellTests{
class FakeDataSource: NSObject,UITableViewDataSource {
func tableView(tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return UITableViewCell()
}
}
}
这是ItemCell.swift代码:
import UIKit
class ItemCell: UITableViewCell {
@IBOutlet weak var titleLabel: UILabel!
func configCellWithItem(item: TodoItem){
}
}
绑定到故事板的所有属性都已连接.什么被忽视了?
解决方法
看起来这段代码来自我的书.这是本书中的一个已知错误.将测试方法更改为以下内容:
func testSUT_HasNameLabel(){
let storyboard = UIStoryboard(name: "Main",bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("ItemListViewController") as! ItemListViewController
_=controller.view
let tableView = controller.tableView
let dataProvider = FakeDataSource()
tableView.dataSource = dataProvider
let cell = tableView.dequeueReusableCellWithIdentifier("ItemCell",inSection: 0)) as! ItemCell
XCTAssertNotNil(cell.titleLabel)
}
然后,当您稍后重构该代码以将设置放入setUp方法时,将一个属性let dataProvider = FakeDataSource()添加到测试用例并将其设置为setUp中表视图的数据源(tableView.dataSource = dataProvider) .