私はアイテムの全情報が表示される最終ビューにプッシュしようとしています。 100%のために働くgetItemsOverView方法でdidSelectRowAtIndexPathに配列の問題があります。範囲外
選択:私は前にチェックした何
- (void)tableView:(UITableView *)atableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Item *itemObj; //object that holds data for cell for current view
ItemShow *itemOverViewObj; //data object for the next view
if(atableView==self.tableView)
{
//ordinary tabeView
itemObj=[self.itemsArray objectAtIndex:[indexPath row]];
}
else
{
//filtered with search tableView
itemObj=[self.filteredItems objectAtIndex:[indexPath row]];
}
//The array which will store the data for overview
NSMutableArray *itemsOverViewArr=[[NSMutableArray alloc]initWithCapacity:1];
DBAccess *access=[[DBAccess alloc]init];
//method for fetching data from db and inserting into array
itemsOverViewArr=[access getItemsOverView:itemObj.itemID];
[access closeDataBase];
[access release];
//here is the evil.
itemOverViewObj=[itemsOverViewArr objectAtIndex:[indexPath row]];
[itemsOverViewArr release];
ItemOverView *iov=[[ItemOverView alloc]initWithNibName:@"ItemOverView" bundle:nil];
iov.title=self.nominal;
[iov setItemShow:itemOverViewObj];
[self.navigationController pushViewController:iov animated:YES];
[iov release];
}
。 itemObj.itemIDは正しいintを取得します。
で問題が発生しました。itemOverViewObj = [itemsOverViewArr objectAtIndex:[indexPath row]];
エラー:*によりキャッチされない例外 'NSRangeException'、理由にアプリを終了: '* - [NSMutableArrayのobjectAtIndex:]:境界を超えてインデックス1 [0 .. 0]' DBACCESSで
getItemsOverviewのメタあなたはitemsOverViewArr
で2番目の項目(インデックス1)にアクセスしようとしているが、この配列は唯一の含まれています。クラス
-(NSMutableArray*)getItemsOverView:(int)itemID
{
NSMutableArray *itemsArray=[[[NSMutableArray alloc]init]autorelease];
const char *sqlItems=sqlite3_mprintf("SELECT itm.itemID,itm.itemYear,itm.rarity,dateComment,itm.mintage,dc.dateCode as dateCode,iaval.availability as avalibility,iaval.quality as quality,itm.Mintmark,itm.specialRemark\
from items itm\
join itemAvailability iaval on iaval.itemID=itm.itemID\
join dateCultures dc ON dc.dateCultureID=itm.dateCulture\
WHERE itm.itemID=%i",itemID);
sqlite3_stmt *statement;
int sqlResult = sqlite3_prepare_v2(database, sqlItems, -1, &statement, NULL);
if (sqlResult== SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
ItemShow *itemShow=[[ItemShow alloc]init];
itemShow.itemID=sqlite3_column_int(statement, 0);
char *itemYear=(char *)sqlite3_column_text(statement, 1);
char *mintMark=(char *)sqlite3_column_text(statement, 2);
char *masterMark=(char *)sqlite3_column_text(statement, 3);
itemShow.rarity=sqlite3_column_int(statement, 4);
itemShow.availability=sqlite3_column_int(statement, 5);
itemShow.quality=sqlite3_column_int(statement, 6);
char *mintage=(char *)sqlite3_column_text(statement, 7);
itemShow.itemYear=(itemYear)?[NSString stringWithUTF8String:itemYear]:@"";
itemShow.mintMark=(mintMark)?[NSString stringWithUTF8String:mintMark]:@"";
itemShow.masterMark=(masterMark)?[NSString stringWithUTF8String:masterMark]:@"";
itemShow.mintage=(mintage)?[NSString stringWithUTF8String:mintage]:@"Unknown";
[itemsArray addObject:itemShow];
[itemShow release];
}
sqlite3_finalize(statement);
}
else
{
[self dbConnectionError];
}
return itemsArray;
}
は、例外メッセージはそれをすべて言う事前に
itemsOverViewArr = [アクセスgetItemsOverView:itemObj.itemID];の後に空でない; NSLog(@ "%d"、[itemsOverViewArr count])を書きました。それが本当にいっぱいになっているかどうかを確認してください。私は1を得ている。だからそれはいっぱいになっている。 – NCFUSN
@Nathan 1は1つの要素を意味し、objectAtIndex:0を使用して配列のインデックス付けを行うためにはゼロベースで扱う必要があります。しかし元の見積もりでは配列が空であることが示唆されています - あなたの見積りが間違っているか、最新のNSLog結果です。 – Till
ああ、確かに。 – NCFUSN