以下行崩溃了该程序:
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) .