ios – 在无效的indexPath处捕获了对rect的NSInternalInconsistencyException请求

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...