1

1 つのビューでデータの配列と 2 つの UITableViews を使用する ios 用の基本的なプログラムを作成しようとしています。最初のテーブルで行われた選択に基づく配列によって、2 番目の UITableView が設定されるようにします。2 番目のテーブルの配列の配列があります。table1 の最初のセルをクリックすると、必要なデータが table2 に表示されます。しかし、table1 の 2 番目のセルをクリックすると、エラーが発生します。「限界を超えたインデックス 1」

-(void)viewWillAppear:(BOOL)animated{
 [super viewWillAppear:animated];
 NSString *jsonString = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http:/url.com/technology"] encoding:NSStringEncodingConversionAllowLossy error:nil];
NSString *jsonString1 = [NSString stringWithContentsOfURL:[NSURL  URLWithString:@"http://url.com/experience1"] encoding:NSStringEncodingConversionAllowLossy error:nil];
NSString *jsonString2 = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"http:url.com/experirnce2"] encoding:NSStringEncodingConversionAllowLossy error:nil];

SBJSON *parser = [[SBJSON alloc]init];
SBJSON *parser1 = [[SBJSON alloc]init];
SBJSON *parser2 = [[SBJSON alloc]init];

 NSDictionary *results = [parser objectWithString:jsonString error:nil];
[parser release], parser = nil;
    NSDictionary *results1 = [parser1 objectWithString:jsonString1 error:nil];
    NSDictionary *results2 = [parser2 objectWithString:jsonString2 error:nil];
[parser release], parser = nil;
[parser1 release], parser1 = nil;
[parser2 release], parser2 = nil;

self.technologyArray = [results objectForKey:@"response"];
self.technologyData = [technologyArray valueForKey:@"technologyname"];
self.experienceArray1 = [results1 objectForKey:@"response"];
self.experienceData1 = [experienceArray1 valueForKey:@"experiencename"];
self.experienceArray2 = [results2 objectForKey:@"response"];
self.experienceData2 = [experienceArray2 valueForKey:@"experiencename"];
experience = [[NSMutableArray alloc]initWithObjects:experienceData1, experienceData2, nil];


}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (tableView == technologyTable)
return [technologyData count];

else {
return [experience count];
}

 }



 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
// Change UITableViewCellStyle
cell = [[[UITableViewCell alloc] 
     initWithStyle:UITableViewCellStyleSubtitle 
     reuseIdentifier:CellIdentifier] autorelease];
 }

if (tableView == technologyTable)
{

cell.textLabel.text=[technologyData objectAtIndex:indexPath.row];

} 

if (tableView == experienceTable)
{
 cell.textLabel.text = [[experience  objectAtIndex:indexPath.row]objectAtIndex:indexPath.row];
[experienceTable reloadData];

}
return cell ;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 if (tableView == technologyTable)
{

experienceTable = [[experience objectAtIndex:indexPath.row] objectAtIndex:indexPath.row];


 selectTechnology.text = [technologyData objectAtIndex:indexPath.row];

 self.technologyList.hidden = YES;

}
 if(tableView == experienceTable)
 {
 self.experienceList.hidden = YES;
 selectExperience.text = [[experience objectAtIndex:1] objectAtIndex:indexPath.row];
 }
 [experience release ];

  }
4

2 に答える 2

0

2 つのテーブルに 2 つの異なるデリゲートとデータ ソースを使用します。最初のテーブルで選択すると、そのデリゲートは、2 番目のテーブルのデリゲートがリッスンする通知を送信します。2 番目のテーブルのデリゲートが通知を受け取ると、適切なデータ (エクスペリエンス配列とデータ 1 または 2 のいずれか) を表示するように自身を設定し、 を呼び出します[table2 reloadData]

于 2012-11-03T15:06:40.323 に答える
0

最初のテーブルビューでどの行が選択されているかを判断し(cellForRowAtIndexPath選択を ivar に保存できます)、適切な配列の値を 2 番目のテーブルビューに表示する必要があります。ユーザーが最初のテーブルから値を選択した後、[experienceTable reloadData] を呼び出す必要があります。

このようなもの:

- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
    if (tableView == technologyTable)
    {
        selectedTechnology = indexPath.row;
        [experienceTable reloadData];
    }
}

その後:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ...


    if (tableView == experienceTable)
    {
        cell.textLabel.text = experience[selectedTechnology][indexPath.row];
    }
}
于 2012-11-03T15:08:32.623 に答える