0

我正在将核心数据中的数据检索到 2 个数组中。

-(void)loadData{

AppDelegate *delegate = (AppDelegate*) [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.managedObjectContext;

   NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entityLocation = [NSEntityDescription entityForName:@"Devices" inManagedObjectContext:context];
fetchRequest.entity = entityLocation;


NSPredicate *predicate = [NSPredicate predicateWithFormat:@"location = %@",actuallLocationName];
[fetchRequest setPredicate:predicate];

NSError *error;
NSArray *temp = [context executeFetchRequest:fetchRequest error:&error];
NSLog(@"matches in hostArray = %d",[temp count]);


hostArray = [temp valueForKey:@"hostname"];
deviceArray = [temp valueForKey:@"devicename"];

[myTable reloadData];
}

在我的 UITableView 中,我有 2 个部分 --section 0 有 2 个不同的自定义单元,第 1 部分显示来自数组的数据

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == 0) {
    return 2;
}
       return [hostArray count];

}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath     *)indexPath
{
   static NSString *CustomCell = @"CustomCell";
   static NSString *CustomCell1 = @"CustomCell1";
   static NSString *CustomCell2 = @"CusrtomCell2";

UITableViewCell *cellA = [tableView dequeueReusableCellWithIdentifier:CustomCell1];
if (cellA == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"SettingCellHost" owner:self options:nil];
    cellA=hostNameCell;
    self.hostNameCell=nil;
}

UITableViewCell *cellB = [tableView dequeueReusableCellWithIdentifier:CustomCell2];
if (cellB == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"SettingCellDevice" owner:self options:nil];
    cellB=deviceNameCell;
    self.deviceNameCell=nil;
}

UITableViewCell *cellC = [tableView dequeueReusableCellWithIdentifier:CustomCell];
if (cellC == nil) {
    [[NSBundle mainBundle] loadNibNamed:@"DefaultCell" owner:self options:nil];
    cellC=defaultCell;
    self.defaultCell=nil;
}
if ([hostArray count] != 0) {
    [defaultCellLabel setText:[hostArray objectAtIndex:indexPath.row]];
}



if (indexPath.section == 0) {
    if (indexPath.row == 0) {
        return cellA;
    }
}

if (indexPath.section == 0) {
    if (indexPath.row == 1) {
        return cellB;
    }
}


return cellC;
}

启动应用程序崩溃后

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI       objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

但数组不是空的

2012-05-27 18:10:39.010 TabWithCore[7249:fb03] Array 1 is (
1234567
) and Array 2 is (
Host
)

奇怪的是,当我将第 0 部分的值 numberofrows 从 2 --> 更改为 1 时,一切正常......

4

3 回答 3

0

您的数组中只有一个对象......并且您正试图从中设置两个单元格。因此,当它尝试访问数组的第二个对象时,它会崩溃,因为第二个对象不存在......

于 2012-05-27T16:36:43.393 回答
0

你的主要问题是你没有初始化temp数组。您刚刚通过名称声明了它并分配了值。NSArray *temp = [context executeFetchRequest:fetchRequest error:&error];

所以到那时,你的temp数组没有填满,结果你hostArray也没有填满。就我的观点而言,出于这个原因,您会收到此错误Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

所以试试这个alloc init temp数组的解决方案......希望它可以解决你的问题......:)

于 2012-05-28T06:47:43.470 回答
0

执行以下代码时不检查您所在的部分。因此,当部分为 0(2 行)且 indexPath.row 为 1 时,当它尝试访问 hostArray[1] 而它只有 1 个值时,会引发异常.

if ([hostArray count] != 0) {
    [defaultCellLabel setText:[hostArray objectAtIndex:indexPath.row]];
}

要解决此问题,请在执行任何此代码之前检查该部分。像下面这样的东西会起作用。

if (indexPath.section == 1)    
{
    UITableViewCell *cellC = [tableView dequeueReusableCellWithIdentifier:CustomCell];
    if (cellC == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"DefaultCell" owner:self options:nil];
        cellC=defaultCell;
        self.defaultCell=nil;
    }
    if ([hostArray count] != 0) {
        [defaultCellLabel setText:[hostArray objectAtIndex:indexPath.row]];
    }
    return cellC;
}
于 2012-05-28T06:53:08.123 回答