0

heightForRowAtIndexPathそのセル内のビューを表示および非表示にする関数を呼び出そうとしていますが、不本意ながら無限ループを作成しました。何が問題なのか、どうすれば解決できるのかを指摘してください。

機能heightForRowAtIndexPath

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"indexrow = %ld \n pre = %d\n sel = %d \n",(long)[indexPath row],previousselectedcell,selectedcell);
    if([indexPath row] == previousselectedcell){       
        return 60;
    }
    else if ([indexPath row] == selectedcell) {    
        NSLog(@"height toggle= %@",toggle);
        [self ViewToggle:tableView IndexPath:indexPath Do:@"true"];
        return 180;
    }
    else
    {
        return 60;
    }
}

関数定義

-(void)ViewToggle:(UITableView *)tableView IndexPath:(id)myindexPath Do:Toggle{
    InterestTableViewCell *cell = (InterestTableViewCell *) [tableView cellForRowAtIndexPath:myindexPath];
    if([Toggle isEqualToString:@"true"]){
        cell.ContainerView.hidden=NO;
    }
    else{
        cell.ContainerView.hidden=YES;
    }  
}
4

5 に答える 5

2

問題はここにあります

InterestTableViewCell *cell = (InterestTableViewCell *) [tableView cellForRowAtIndexPath:myindexPath];

テーブルからセルを取得しようとしています。しかし、セルはまだ作成されていません。セルの作成に戻ります

heightForRowAtIndexPath は、セルのコンテンツを構成するのに適した場所ではありません。tableView:didSelectRowAtIndexPath: メソッドで行う方がよい

于 2015-05-29T11:08:16.903 に答える
1

無限ループの問題を厳密に見ると、問題は、新しいセル オブジェクトを作成するプロセスでInterestTableViewCell *cell = (InterestTableViewCell *) [tableView cellForRowAtIndexPath:myindexPath];呼び出しているようです。heightForRowAtIndexPath

の再利用を強くお勧めしUITableViewCellます。

于 2015-05-29T11:09:23.467 に答える
1

ヘッダーで定義 -

@property (nonatomic,retain) NSIndexPath *oldIndex;

heightForRowAtIndexPath の代わりに以下のコードを試してください。

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

    if (self.oldIndex)
    {
        [self ViewToggle:tableView IndexPath:self.oldIndex Do:@"false"];
    }


    [self ViewToggle:tableView IndexPath:indexPath Do:@"true"];
    self.oldIndex=indexPath;

}
于 2015-05-29T11:35:32.603 に答える
1

tableView:heightForRowAtIndexPath:行の高さを返すためにのみ使用してください。tableView:cellForRowAtIndexPath:非表示ロジックには、より適切な場所です。

tableView:cellForRowAtIndexPath:代わりに次を追加します。

cell.ContainerView.hidden = (indexPath.row != selectedcell);

そして、あなたが更新した後に電話[tableView reloadData]してください。tableView:didSelectRowAtIndexPath:selectedcell

また、選択が行われていないことを表す可能性がNSIndexPathあるため、整数ではなくを格納することも検討する必要があります。nil

于 2015-05-29T11:07:44.787 に答える