以下是打印到控制台的错误:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '***
-[__NSArrayI objectAtIndex:]: index 2 beyond bounds [0 .. 1]'
*** First throw call stack:
(0x27f0012 0x1a51e7e 0x27a5b44 0xde6d 0xe2f8fb 0xe2f9cf 0xe181bb 0xe28b4b 0xdc52dd 0x1a656b0 0x97efc0 0x97333c 0x973150 0x8f10bc 0x8f2227 0x99c333 0x99c75f 0x27af376 0x27aee06 0x2796a82 0x2795f44 0x2795e1b 0x22677e3 0x2267668 0xd74ffc 0x258d 0x24b5 0x1)
libc++abi.dylib: terminate called throwing an exception
该计划完全打破了:
NSString *cellValue = [models objectAtIndex:indexPath.row];
来自 cellForRowAtIndexPath:方法
以下是所有tableview方法:
//---set the title for each section---
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
//countyIndex returns the number of counties per state
//in the debugger I checked and the countyIndex is returning the correct number
//of counties!
return [countyIndex objectAtIndex:section];
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return [countyIndex count];
}
//---set the number of rows in each section---
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//---get the county in section---
NSString *county = [countyIndex objectAtIndex:section];
//---get all models from the county---
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"countyName == %@", county];
NSArray *mods = [modelArray filteredArrayUsingPredicate:predicate];
//---return the number of models from the county---
return [mods count];
}
//models appears to be counted as the number of objects per section
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
// now configure the cell
//---get the county in the current section---
NSString *county = [countyIndex objectAtIndex:[indexPath section]];
//---get all models from the county---
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"countyName == %@", county];
NSArray *mods = [modelArray filteredArrayUsingPredicate:predicate];
NSMutableArray *newModelArray = [[NSMutableArray alloc] init];
for (NSManagedObject *obj in mods) {
[newModelArray addObject:[NSString stringWithFormat:@"%@",[obj valueForKey: @"model"]]];
}
//get rid of duplicates
NSArray *objectsWithDuplicates = newModelArray;
NSSet *duplicatesRemover = [NSSet setWithArray:objectsWithDuplicates];
models = [duplicatesRemover allObjects];
models = [models sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
UITableViewCell *bgView = [[UITableViewCell alloc] initWithFrame:CGRectZero];
//cell.contentView.backgroundColor = [UIColor whiteColor];
bgView.backgroundColor = [UIColor whiteColor];
cell.backgroundView = bgView;
cell.layer.borderColor = [[UIColor lightGrayColor] CGColor];
cell.layer.borderWidth = .50;
if ([models count]>0) {
//---extract the relevant model from the model object---
NSString *cellValue = [models objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;
[cell setAccessibilityTraits:UIAccessibilityTraitButton];
}
return cell;
}
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
//index path to row that's selected
NSIndexPath *myIndexPath = [self.sTable indexPathForSelectedRow];
UITableViewCell *cell = [self.sTable cellForRowAtIndexPath:myIndexPath];
labelText = cell.textLabel.text;
selectedModel = cell.textLabel.text;
}
从控制台执行一些命令后:
po [模特计数]
po(int)[indexPath row]
我看到当[models count]等于2并且[indexPath row]也等于2时它会断开,这当然会使它超出范围,因为2表实际上是3,因为表索引从0开始。 / p>
问题是,为什么会发生这种情况?我在切换表值后已经重新加载了tabledata,然后我查看了每个部分的所有行数并且它们看起来是正确的。那为什么还会发生这种情况呢?奇怪的是这个中断发生在cellForRowAtIndexPath :( NSIndexPath *)indexPath重新调用后,我在表格中向下滚动。
这发生在所有模拟器ios 5.0 - Xos 4.6.1中的ios 6.1
中的 的 **编辑:
我应该补充一点,这只发生在加利福尼亚州和威斯康星州。 我认为这有助于缩小范围,但我检查了数据库,并且县和模型的数量在调试器中返回的内容之间是匹配的。
答案 0 :(得分:1)
这是因为在cellForRowAtIndexPath
中删除了重复项。但是你不会在numberOfRows
中这样做。因此cellForRow
中的模型数组比numberOfRows
中的计数更短。
这是为什么DRY是如此重要的规则的典型案例:不要重复自己。通过两种不同的方法做同样的事情,你不仅浪费代码并使你的代码难以维护,而且你冒着在这两个地方做同样事情的风险。您应该将导出特定部分(县)的实际模型的代码分解出来,以便只有一个方法,而其他两个方法可以参考。 (更好的方法是准备一个更好的模型,或许:在行和数组索引之间总是只有一对一的简单对应关系。)