1

我正在解析来自在线提要的一些数据,然后将这些数据放入多个对象中,然后我有一个显示选项的页面,然后进入一个显示该数组中所有部分的表格视图。

我想出的问题是 10/11 选项没有问题,如果您查看了另一个选项然后尝试输入它,我提出的最后一个选项会出现越界异常。如果首先输入第 11 个选项,那么它可以正常工作,如果您查看其他选项,则关闭选项页面并返回查看第 11 个选项,它也可以正常工作。

这是我将数据分类到区域中的代码(这只是我遇到问题的部分):

-(void)TBSortOut {
    [app.TBArray removeAllObjects];
    NSLog(@"this is running");
      for (int i = 200; i < app.listArray.count; i++) {
          theList = [app.listArray objectAtIndex:i];
          if ([theList.course rangeOfString:@"Time Based Art & Digital Film" options:NSCaseInsensitiveSearch].location == NSNotFound) {
          }else{
            [self sortOutArray];
            [app.TBArray addObject:theList];
            theList = nil;
          }
       }
}

接下来是我的 masterViewController 中的代码部分,它对表格中的单元格进行排序,我认为我的问题是:

- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath {
@try{
  theList = NULL;
  static NSString *CellIdentifier = @"Cell";
  UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    cell.shouldIndentWhileEditing = NO;
   }
   //selecting which array to display within the tableview
   if (app.courseChoice == 11) {
     theList = [app.TBArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 1) {
     theList = [app.AniArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 2) {
     theList = [app.APCPArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 3) {
     theList = [app.DIXDArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 4) {
     theList = [app.FAArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 5) {
     theList = [app.GDArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 6) {
     theList = [app.ILLArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 7) {
     theList = [app.IEDArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice ==  {
     theList = [app.JEWArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 9) {
     theList = [app.PROArray objectAtIndex:indexPath.row];
   } else if (app.courseChoice == 10) {
     theList = [app.TEXArray objectAtIndex:indexPath.row];
   } 

   //sets name of the cell and the type of indicator used within the cell(arrow)
   cell.textLabel.text = theList.fullname;
   cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

   return cell;
 }
 @catch(NSException *e){
   NSLog(@"catching %@ reason %@", [e name], [e reason]);
 }
}

try catch 正在打印的错误是:

catching NSRangeException reason *** - [_NSArrayM objectAtIndex:]: index 10 beyond bounds [0 .. 9]

我已经尝试在代码中的各个点打印出来,NSLog似乎发生的事情是表尝试在前一个视图告诉表要使用哪个视图之前加载信息,因此表视图尝试加载更大的表数组并在它意识到它正在加载的数组小于它认为应该的数组时遇到错误。

我该如何解决这个问题?有什么方法可以将代码放在try/catchif,如果它到达所选数组的末尾,它会停止运行?或者有什么方法可以强制应用程序重新加载带有选项的页面,以便问题停止?

编辑:崩溃前的日志,第一组来自选项页面,然后显示在表格视图中,显示每个单独数组的计数。第二组显示数组,一旦选择了一个数组,课程就会在应用程序崩溃时出现(“(m)”只是为了让我知道日志来自不同的视图):

2013-04-30 15:23:14.985 Degree Show 2013[5665:907] AniArray amount 17
2013-04-30 15:23:14.986 Degree Show 2013[5665:907] APCPArray amount 6
2013-04-30 15:23:14.987 Degree Show 2013[5665:907] DIXDArray amount 5
2013-04-30 15:23:14.987 Degree Show 2013[5665:907] FAArray amount 65
2013-04-30 15:23:14.988 Degree Show 2013[5665:907] GDArray amount 17
2013-04-30 15:23:14.989 Degree Show 2013[5665:907] ILLArray amount 19
2013-04-30 15:23:14.990 Degree Show 2013[5665:907] IEDArray amount 23
2013-04-30 15:23:14.990 Degree Show 2013[5665:907] JEWArray amount 20
2013-04-30 15:23:14.991 Degree Show 2013[5665:907] PROArray amount 26
2013-04-30 15:23:14.992 Degree Show 2013[5665:907] TEXArray amount 26
2013-04-30 15:23:14.992 Degree Show 2013[5665:907] TBArray amount 10

2013-04-30 15:24:31.819 Degree Show 2013[5665:907] (m)AniArray amount 17
2013-04-30 15:24:31.820 Degree Show 2013[5665:907] (m)APCPArray amount 6
2013-04-30 15:24:31.820 Degree Show 2013[5665:907] (m)DIXDArray amount 5
2013-04-30 15:24:31.821 Degree Show 2013[5665:907] (m)FAArray amount 65
2013-04-30 15:24:31.821 Degree Show 2013[5665:907] (m)GDArray amount 17
2013-04-30 15:24:31.822 Degree Show 2013[5665:907] (m)ILLArray amount 19
2013-04-30 15:24:31.823 Degree Show 2013[5665:907] (m)IEDArray amount 23
2013-04-30 15:24:31.823 Degree Show 2013[5665:907] (m)JEWArray amount 20
2013-04-30 15:24:31.824 Degree Show 2013[5665:907] (m)PROArray amount 26
2013-04-30 15:24:31.824 Degree Show 2013[5665:907] (m)TEXArray amount 26
2013-04-30 15:24:31.825 Degree Show 2013[5665:907] (m)TBArray amount 10
2013-04-30 15:24:31.829 Degree Show 2013[5665:907] (m)course choice = 11

编辑2:一些发展,我在@finally之后添加了一个try/catch,它正在停止崩溃,但导致一些额外的单元格出现在最终视图中,这个数字实际上似乎是您访问的前一个数组中的对象数。还应该提到的是,所有这些测试都是在 iPhone 5 上完成的,我刚刚在 iPhone 4 上进行过测试,一切正常。新 iphone 处理的桌子与以前的 iphone 处理的桌子不同吗?

4

1 回答 1

0

我认为您无法使用当前拥有的代码真正解决此问题。我最好的猜测是您正在更改 tableView 正在显示的数据正在数据源和委托调用之间发生变化。

我要做的是创建 tableView 从中显示的单个数组,而不是执行巨大的 if/else 块。在设置 app.courseChoice 值的代码中,将新的 tableView 数据数组设置为正确的数组,然后告诉 tableView 重新加载。

像这样的东西:

-(IBAction)changeCourseChoice:(id)sender
{
    app.courseChoice = [sender selectedIndex];
    if (app.courseChoice == 11) {
      self.theList = [app.TBArray objectAtIndex:indexPath.row];
    } else if (app.courseChoice == 1) {
      self.theList = [app.AniArray objectAtIndex:indexPath.row];
    } // ...

    [self.tableView reloadData];
}
于 2013-05-02T00:39:06.057 回答