1

各タブのナビゲーションコントローラーを含む1つのタブバーコントローラーを持つアプリがあります。すべてのナビゲーション コントローラーは、最終的に DetailViewController という名前のビュー コントローラーになります。ただし、ユーザーが 1 つのタブで DetailViewController に移動してからタブを切り替えて、そこでも DetailViewController に移動すると、アプリが次のエラーでクラッシュします。

2011-08-19 21:14:45.257 Kluringar[4368:ef03] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 0]'

DetailViewController をプッシュするコードは次のようになります。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    kluringIdString = [[kluringar objectAtIndex:indexPath.row] objectForKey:@"id"];
    DetailViewController *detail = [self.storyboard instantiateViewControllerWithIdentifier:@"detail"];
    [self.navigationController pushViewController:detail animated:YES];
}

データベースからデータを取得して配列に追加するコードは次のようになります。

-(void) getAllRowsFromTableNamed {
    //—-retrieve rows—- 
    NSString *qsql = [NSString stringWithFormat:@"SELECT * FROM Kluringar ORDER BY rubrik"];    
    sqlite3_stmt *statement;    
    kluringar = [[NSMutableArray alloc] init];
    NSMutableDictionary *kluringarDictionary = [[NSMutableDictionary alloc] init];
    if (sqlite3_prepare_v2( db, [qsql UTF8String], -1, &statement, nil) == SQLITE_OK) {     
        while (sqlite3_step(statement) == SQLITE_ROW) {
            char *kluringId = (char *) sqlite3_column_text(statement, 2);           
            NSString *kluringIdStr = [[NSString alloc] initWithUTF8String: kluringId];
            char *rubrik = (char *) sqlite3_column_text(statement, 3);          
            NSString *rubrikStr = [[NSString alloc] initWithUTF8String: rubrik];
            //---add items--- 
            [kluringarDictionary setValue:kluringIdStr forKey:@"id"];
            [kluringarDictionary setValue:rubrikStr forKey:@"rubrik"];
            [kluringar addObject:[kluringarDictionary copy]];       
        }   
        //—-deletes the compiled statement from memory—-        
        sqlite3_finalize(statement);        
    }   
}

ストーリーボードへのリンクは次のとおりです。

よろしくお願いします!:)

4

1 に答える 1

0

この行で配列にアクセスしようとしています

kluringIdString = [[kluringar objectAtIndex:indexPath.row] objectForKey:@"id"];

複数の要素を持つ必要がありますが、そうではありません。コードを調べて、kluringar 配列に追加された要素の数を確認することをお勧めします。

于 2011-08-19T19:47:24.483 に答える