1

XMLファイルをUITableViewに解析するiPhoneアプリに取り組んでいます。XMLファイル内のアイテムのすべてのタイトルがリストされており、指定されたセルが選択されたときに、セルを展開して選択したアイテムの本文コンテンツを追加しようとしています。

セルを正しく展開することはできますが、うまくいかなかった場合は、本文のコンテンツをサブビューとして追加します。セルにcellForRowAtIndexPath入力すると、本文のコンテンツを追加でき、正常に表示されます。

私の質問は、選択したセルにサブビューを追加するにはどうすればよいですか?

cellForRowAtIndexPath「機能している」bodyLabelがコメントアウトされた私の関数:

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

static NSString *cellID = @"Cell";
issue *curIssue = [[parser issues] objectAtIndex:indexPath.row];

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];


    CGRect nameFrame = CGRectMake(0,2,300,15);
    UILabel *nameLabel = [[UILabel alloc] initWithFrame:nameFrame];
    nameLabel.tag = 1;
    nameLabel.font = [UIFont boldSystemFontOfSize:12];
    [cell.contentView addSubview:nameLabel];

    CGRect bodyFrame = CGRectMake(0,16,300,60);

    UILabel *bodyLabel = [[UILabel alloc] initWithFrame:bodyFrame];
    bodyLabel.tag = 2;
    bodyLabel.numberOfLines = 10;
    bodyLabel.font = [UIFont systemFontOfSize:10];
    bodyLabel.hidden = YES;

    [cell.contentView addSubview:bodyLabel];

}



    UILabel *nameLabel = (UILabel *)[cell.contentView viewWithTag:1];
    nameLabel.text     = [curIssue name];

    UILabel *bodyLabel = (UILabel *)[cell.contentView viewWithTag:2];
    bodyLabel.text     = [curIssue body];

    return cell;
}

これが私のheightForRowAtIndexPath関数で、サブビューを追加しようとしています。実行しようとすると、要素を割り当てようとすると EXC_BAD_ACESS 例外が発生し*bodyLabelます。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger defCellHeight  = 15;
NSInteger heightModifier = 10;
if([self cellIsSelected:indexPath]){
    return defCellHeight * heightModifier;
}

return defCellHeight;
}

didSelectRowAtIndexPathセルの成長/縮小を可能にする私の関数:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{     
    BOOL isSeld = ![self cellIsSelected:indexPath];

    NSNumber *seldIndex = [NSNumber numberWithBool:isSeld];
    [selectedIndexes setObject:seldIndex forKey:indexPath];

    UILabel *label = (UILabel *)[tableView viewWithTag:2];
    label.hidden = NO;

    [curIssView beginUpdates];
    [curIssView endUpdates];
}

最後に、cellIsSelectedセルが選択されている場合に true を返すヘルパー関数:

-(bool) cellIsSelected:(NSIndexPath *)indexPath
{
    NSNumber *selIndex = [selectedIndexes objectForKey:indexPath];
    return selIndex == nil ? FALSE : [selIndex boolValue];
}

完全なソース ファイルはここにあります

4

3 に答える 3

1

同じ UILabel を複数回割り当てて追加しているようです。cellForRowAtIndexPathメソッド内で一度だけ実行する必要があります。bodyLabelメソッドでを非表示に設定cellForRowAtIndexPathし、セルが選択されたときに非表示にしないように設定することもできます。次のようなもので:

bodyLabel.hidden = YES;

別物。内の行を選択解除するのはなぜdidSelectRowAtIndexPathですか?

于 2013-06-28T02:06:14.757 に答える
0

heightForRowAtIndexPath で UILabel を作成するのはなぜですか? 行に追加しようとしている場合は、上記で使用した cellForRowAtIndexPath メソッドを使用します。

didSelectRowAtIndexPath内のUIViewのaddSubviewメソッドを使用して、UITableViewCellまたはビュー内の他の場所にサブビューを追加するだけで、UITableView行が選択されたときにサブビューを表示できます。

于 2013-06-28T01:20:46.630 に答える
0

セルを選択したときにセルにサブビューを追加するには、非常に簡単です。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{     
    /*
     .. your other setup
    */

    UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
    [cell.contentView addSubview:<your subview>];
}
于 2013-06-28T18:20:05.043 に答える