拉动刷新导致应用程序崩溃:NSRangeException,原因:索引 8 超出范围 [0 .. 4]
Pull to refresh resulting app to crash: NSRangeException, reason: index 8 beyond bounds [0 .. 4]
抱歉,如果之前有人问过这个问题,但我找不到问题的答案。
我编写了用于拉动刷新的代码,但如果结果数组计数与 indexPath.row
不同,它就会崩溃,并且我已尝试删除我的数组对象,但它仍然崩溃。
我的代码适用于此:
-(void)loadMore:(id) sender {
loadFlag = 1;
NSString *employeeID = @"aaa";
days = 3;
int projIDNum = 1234;
int depCode = 1234000001;
int caseNum = 45678;
NSString *result = [client report_search:employeeID case_no:caseNum status:loadFlag
day:days project_id:projIDNum dep_code:depCode count:10];
if ([result isEqualTo:@"[]"]) {
[Utilities callAlert:self title:@"No More Data" body:@"There is no other data contains"];
[refresh endRefreshing];
} else {
NSData *jsonData = [result dataUsingEncoding: NSUTF8StringEncoding];
NSError *error;
[resultArr removeAllObjects];
// resultArr is NSMutableArray and it's the tableview's data source
resultArr = [[NSJSONSerialization JSONObjectWithData:jsonData options: 0
error:&error] mutableCopy];
[refresh endRefreshing];
[_mSearchTableView reloadData];
}
}
如果我得到完整的 10 个数据结果,程序本身不会崩溃,但是当我从 Web 服务中得到的数据少于 10 个时,它就会崩溃。我不断收到此异常,NSRangeException, reason: index 8 beyond bounds [0 .. 4]
但不知道如何处理。
我的表格视图设置:
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
-(NSInteger) table:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [resultArr count];
}
这是我的 cellForRowAtIndexPath – Tj3n
-(UITableViewCell) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
// clear cell
for ([UIView *view in [cell.contentView subviews]]) {
if ([view isKindOfClass:[UIView class]]) {
[view removeFromSuperview];
}
}
UILabel *titleLabel = [[UILabel alloc] init];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
} else {
titleLabel = [cell.contentView viewWithTag:100];
}
CGRect location = CGRectMake(20, 20, 71/75, 40/146);
titleLabel = [[UILabel alloc] initWithFrame:location];
titleLabel.textAlignment = NSTextAlignmentNatural;
titleLabel.text = [resultArr valueForKey:@"title"][indexPath.row]; // this is the line always crashed
[cell.contentView addSubview:titleLabel];
return cell;
}
也在更新我的 json:
print out result: [
{
Content = "Test\nTest\n";
"Create_Datetime" = "2016-09-12 10:18:25";
"Project_ID" = 2023;
Status = 4;
"CASE_NO" = 17704;
Title = "Table title";
"Update_Datetime" = "2016-09-12 10:19:09";
},
{
Content = "Fhujhfdfhjoookbvv\nGu...";
"Create_Datetime" = "2016-09-12 10:09:28";
"Project_ID" = 2023;
Status = 4;
"CASE_NO" = 17703;
Title = "Table title";
"Update_Datetime" = "2016-09-12 10:12:59";
},
{
Content = dafsdfasfasfas;
"Create_Datetime" = "2016-09-04 01:52:09";
"Project_ID" = 2023;
Status = 5;
"CASE_NO" = 16512;
Title = "Table title";
"Update_Datetime" = "2016-09-14 16:44:46";
},
{
Content = dafsdfa;
"Create_Datetime" = "2016-09-04 01:41:59";
"Project_ID" = 2023;
Status = 4;
"CASE_NO" = 16511;
Title = "Table title";
"Update_Datetime" = "2016-09-04 01:42:23";
},
{
Content = sdfasfasf;
"Create_Datetime" = "2016-09-02 14:14:39";
"Project_ID" = 2023;
Status = 2;
"CASE_NO" = 16502;
Title = "Table title Table subtitle";
"Update_Datetime" = "2016-09-02 15:17:50";
}]
更新:
我试图在崩溃前在不同的地方打印出数组计数的日志。
第一名是before table reload
,数组中的对象个数是5。
第二名在cellForRowsAtIndexpath
。我有 2 件物品要打印出来
- resultArr的总数为5,与数组一致
重新加载前计数。
- 当前indexpath.row。这里发生的奇怪事情是它在第 8 个单元格而不是第 5 个。
最后,我打印日志的地方在numberOfRowsInSection
。应用程序崩溃之前,它不会打印出日志。
我认为您获得标题的方式有问题,而不是 titleLabel.text = [resultArr valueForKey:@"title"][indexPath.row];
,您可以尝试以下方法吗?如果这不起作用,您能否打印出每个值的值,即 'dictionary' 和 'title' 的值是多少。
NSDictionary *dictionary = [resultArr objectAtIndex:indexPath.row];
NSString *title = [dictionary objectForKey:@"Title"];
titleLabel.text = title;
NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds for empty array'
谢谢JingJingTao和Tj3n的帮助。
我终于找到了这个错误的答案,但我仍然无法弄清楚这个错误的原因和原因。从逻辑上讲,它应该首先转到 numberOfRowsInSection
来设置当前 table 的行数,但显然它没有。有人可以解释这是为什么吗?
抱歉,如果之前有人问过这个问题,但我找不到问题的答案。
我编写了用于拉动刷新的代码,但如果结果数组计数与 indexPath.row
不同,它就会崩溃,并且我已尝试删除我的数组对象,但它仍然崩溃。
我的代码适用于此:
-(void)loadMore:(id) sender {
loadFlag = 1;
NSString *employeeID = @"aaa";
days = 3;
int projIDNum = 1234;
int depCode = 1234000001;
int caseNum = 45678;
NSString *result = [client report_search:employeeID case_no:caseNum status:loadFlag
day:days project_id:projIDNum dep_code:depCode count:10];
if ([result isEqualTo:@"[]"]) {
[Utilities callAlert:self title:@"No More Data" body:@"There is no other data contains"];
[refresh endRefreshing];
} else {
NSData *jsonData = [result dataUsingEncoding: NSUTF8StringEncoding];
NSError *error;
[resultArr removeAllObjects];
// resultArr is NSMutableArray and it's the tableview's data source
resultArr = [[NSJSONSerialization JSONObjectWithData:jsonData options: 0
error:&error] mutableCopy];
[refresh endRefreshing];
[_mSearchTableView reloadData];
}
}
如果我得到完整的 10 个数据结果,程序本身不会崩溃,但是当我从 Web 服务中得到的数据少于 10 个时,它就会崩溃。我不断收到此异常,NSRangeException, reason: index 8 beyond bounds [0 .. 4]
但不知道如何处理。
我的表格视图设置:
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
-(NSInteger) table:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [resultArr count];
}
这是我的 cellForRowAtIndexPath – Tj3n
-(UITableViewCell) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellIdentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];
// clear cell
for ([UIView *view in [cell.contentView subviews]]) {
if ([view isKindOfClass:[UIView class]]) {
[view removeFromSuperview];
}
}
UILabel *titleLabel = [[UILabel alloc] init];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
} else {
titleLabel = [cell.contentView viewWithTag:100];
}
CGRect location = CGRectMake(20, 20, 71/75, 40/146);
titleLabel = [[UILabel alloc] initWithFrame:location];
titleLabel.textAlignment = NSTextAlignmentNatural;
titleLabel.text = [resultArr valueForKey:@"title"][indexPath.row]; // this is the line always crashed
[cell.contentView addSubview:titleLabel];
return cell;
}
也在更新我的 json:
print out result: [
{
Content = "Test\nTest\n";
"Create_Datetime" = "2016-09-12 10:18:25";
"Project_ID" = 2023;
Status = 4;
"CASE_NO" = 17704;
Title = "Table title";
"Update_Datetime" = "2016-09-12 10:19:09";
},
{
Content = "Fhujhfdfhjoookbvv\nGu...";
"Create_Datetime" = "2016-09-12 10:09:28";
"Project_ID" = 2023;
Status = 4;
"CASE_NO" = 17703;
Title = "Table title";
"Update_Datetime" = "2016-09-12 10:12:59";
},
{
Content = dafsdfasfasfas;
"Create_Datetime" = "2016-09-04 01:52:09";
"Project_ID" = 2023;
Status = 5;
"CASE_NO" = 16512;
Title = "Table title";
"Update_Datetime" = "2016-09-14 16:44:46";
},
{
Content = dafsdfa;
"Create_Datetime" = "2016-09-04 01:41:59";
"Project_ID" = 2023;
Status = 4;
"CASE_NO" = 16511;
Title = "Table title";
"Update_Datetime" = "2016-09-04 01:42:23";
},
{
Content = sdfasfasf;
"Create_Datetime" = "2016-09-02 14:14:39";
"Project_ID" = 2023;
Status = 2;
"CASE_NO" = 16502;
Title = "Table title Table subtitle";
"Update_Datetime" = "2016-09-02 15:17:50";
}]
更新: 我试图在崩溃前在不同的地方打印出数组计数的日志。
第一名是before table reload
,数组中的对象个数是5。
第二名在cellForRowsAtIndexpath
。我有 2 件物品要打印出来
- resultArr的总数为5,与数组一致 重新加载前计数。
- 当前indexpath.row。这里发生的奇怪事情是它在第 8 个单元格而不是第 5 个。
最后,我打印日志的地方在numberOfRowsInSection
。应用程序崩溃之前,它不会打印出日志。
我认为您获得标题的方式有问题,而不是 titleLabel.text = [resultArr valueForKey:@"title"][indexPath.row];
,您可以尝试以下方法吗?如果这不起作用,您能否打印出每个值的值,即 'dictionary' 和 'title' 的值是多少。
NSDictionary *dictionary = [resultArr objectAtIndex:indexPath.row];
NSString *title = [dictionary objectForKey:@"Title"];
titleLabel.text = title;
NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds for empty array'
谢谢JingJingTao和Tj3n的帮助。
我终于找到了这个错误的答案,但我仍然无法弄清楚这个错误的原因和原因。从逻辑上讲,它应该首先转到 numberOfRowsInSection
来设置当前 table 的行数,但显然它没有。有人可以解释这是为什么吗?