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つのセクションがあります。2つの異なるカスタムセルを持つセクション0と、配列からのデータを表示するセクション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

次のコードは、現在のセクションをチェックせずに実行されます。したがって、セクションが 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 に答える
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

あなたの配列にはオブジェクトが1つしかありません...そしてそこから2つのセルを設定しようとしています。したがって、配列の2番目のオブジェクトにアクセスしようとすると、2番目のオブジェクトが存在しないためクラッシュします...

于 2012-05-27T16:36:43.393 に答える