4

我正在不同的设备上测试我的应用程序。该应用程序在我的 iPhone 5 上运行良好,但是,当我在 iPod touch 4g 上测试它时,我得到了这个错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '***  [__NSArrayMinsertObject:atIndex:]: object cannot be nil'
*** First throw call stack:
(0x33f252a3 0x3bba397f 0x33e6f8d9 0x51e25 0x35e180c5 0x35e1814d 0x35e180c5 0x35e18077 0x35e18055 0x35e1790b 0x35e17e01 0x35d405f1 0x35d2d801 0x35d2d11b 0x37a1f5a3 0x37a1f1d3 0x33efa173 0x33efa117 0x33ef8f99 0x33e6bebd 0x33e6bd49 0x37a1e2eb 0x35d81301 0x4fc8d 0x3bfdab20)
libc++abi.dylib: terminate called throwing an exception

崩溃的代码是这个:

/********/
    NSMutableArray *titulosCampoTextArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < campos.count; i++) {

        SignupCell *cell = (SignupCell*)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
        [titulosCampoTextArray addObject:cell.textField.text];
    }
/********/

我在 UIView 内的 UITableView 上使用自定义原型单元 (SignupCell.h)。

找不到错误,或者如何修复它。

编辑:两台设备都运行 iOS 6.1.3,我使用的是 Xcode 4.6.1。

4

2 回答 2

5

UITableView-cellForRowAtIndexPath:方法返回nil,如果当你调用它时单元格在屏幕上不可见。

我的猜测是,在 iPhone 5 上,您的表格可以一次显示所有行,而在较短的 iPod touch 上,最后一两个单元格不可见,-cellForRowAtIndexPath:因此会返回nil,这会使您的应用程序崩溃。

您不应该依赖-cellForRowAtIndexPath请求模型数据!您的视图控制器负责数据,而不是表视图。

-tableView:cellForRowAtIndexPath:使用与在视图控制器的数据源方法中设置表格视图单元格文本相同的方式访问模型数据。

于 2013-04-18T06:33:37.450 回答
1

只需这样做:

NSMutableArray *titulosCampoTextArray = [[NSMutableArray alloc] init];
for (int i = 0; i < campos.count; i++) {

    SignupCell *cell = (SignupCell*)[self.tableView 
        cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]];
    if (cell.textField.text) {
        [titulosCampoTextArray addObject:cell.textField.text];
    }
}

我不知道为什么您显然可以nil在 iPhone 5 上添加,但不能在 iPod 上添加。可能是由于某些其他原因,当您的应用程序在 iPhone 5 上运行时,您从未碰巧拥有nil价值。cell.textField.text

于 2013-04-18T03:09:20.757 回答