首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拉刷新结果应用程序崩溃: NSRangeException,原因:索引8越界[0 .4]

拉刷新结果应用程序崩溃: NSRangeException,原因:索引8越界[0 .4]
EN

Stack Overflow用户
提问于 2016-09-26 02:47:05
回答 2查看 234关注 0票数 0

如果以前有人问过这个问题,很抱歉,但我找不到我的问题的答案。

我编写了用于刷新的代码,但是如果结果数组计数与indexPath.row不同,它就会崩溃,并且我尝试删除数组对象,但它仍然崩溃。

我的代码是这样的:

代码语言:javascript
复制
-(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],但我不知道如何处理它。

我的桌面视图设置:

代码语言:javascript
复制
-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger) table:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [resultArr count];
}

这是我的cellForRowAtIndexPath - Tj3n

代码语言:javascript
复制
-(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:

代码语言:javascript
复制
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。我有两个项目要打印出来

  1. resultArr的总数为5,这与重新加载前的数组计数一致。
  2. 当前的indexpath.row。奇怪的是,在这里发生的是,它在第8单元,而不是第5

最后,我打印日志的地方在numberOfRowsInSection。在应用程序崩溃之前,它不会打印日志。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-03 05:37:12

NSArrayM objectAtIndex:]: index 5 beyond bounds for empty array'

谢谢你,JingJingTao和Tj3n帮助了我。

我终于找到了这个错误的答案,但我仍然不知道为什么和原因。从逻辑上讲,它应该首先转到numberOfRowsInSection来设置当前表的行数,但显然没有。有人能解释一下为什么吗?

票数 0
EN

Stack Overflow用户

发布于 2016-09-26 11:55:07

我想你怎么得到这个标题,而不是titleLabel.text = [resultArr valueForKey:@"title"][indexPath.row];,有什么问题,你能试一下下面的方法吗?如果这不起作用,你能打印出每个值是什么,即“字典”和“标题”的值是什么。

代码语言:javascript
复制
NSDictionary *dictionary = [resultArr objectAtIndex:indexPath.row];
NSString *title = [dictionary objectForKey:@"Title"]; 
titleLabel.text = title;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39694017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档