0

私はUITableViewController静的にグループ化されたセルを持っています。特定のビューで、一部のセルを削除したいと考えています。ただ非表示にすると空白になるので、代わりにセルのrowHeighttoを設定したいと思い0ます。非表示にしたいセルのindexPathを取得できないように見えるため、これを行うのに問題があります。IB接続を介して参照しています。読んだ後、これを行う最良の方法はheightForRowAtIndexPathメソッドを使用することです。これが私のコードです:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSIndexPath *myIndexPath = [self.tableView indexPathForRowAtPoint:self.billToPostalCell.center]; 
    //crashes here

    if ([indexPath isEqual:myIndexPath]) {
        return 0; 
    }
    return 44;
}

この前は、 を試しIndexPathForCellていましたが、クラッシュすることもありました。私が読んだことからheightForRowAtIndexPath、セルが見えない場合でも機能するはずです。クラッシュすると、デバッガーにも何も表示されません。

4

3 に答える 3

3

あなたがしていることは、無限再帰につながる...待って...スタックオーバーフローを引き起こしています!

heightForRowAtIndexPath:これらのメソッドはセルの高さを知る必要があるため、メソッド内でテーブルにセルを要求したり、行に indexPath を要求したりすることはできません。したがって、それらの呼び出しheightForRowAtIndexPath:は呼び出されます。そして、同じ問題のあるメソッドを再度呼び出すため、これは事態が好転するまで続きます。

UITableView目的はセルを非表示にすることなので、適切な方法を使用してテーブルからセルを削除する必要があります( deleteRowsAtIndexPaths:withRowAnimation:)。もちろん、最初にデータ モデルを更新する必要があります (行を削除するため)。

于 2013-04-22T22:49:23.587 に答える
2

セルの可視性と高さを変更するべきではありません。セルを削除して後で追加し直す場合、またはセルを追加しない場合は、UITableView で挿入メソッドと削除メソッドを使用する必要があります。これは、出発点として適切なドキュメントです。

tableView:heightForRowAtIndexPath:さらに、tableView はこのようindexPathForRowAtPoint:な計算を行う前に独自の高さを計算する必要があるため、tableView のメソッドを内部から使用しないでください。無限ループに陥っているため、おそらくエラーが発生しています。

于 2013-04-22T22:40:59.337 に答える
0

-deleteRowsAtIndexPaths:withRowAnimation行を削除するために使用します。セルを削除する代わりに、セルの可視性を操作しないでください。これは深刻なメモリの問題につながる可能性があり、一般的な悪い習慣です。削除したい行の をNSArray入力して渡すだけです。NSIndexPath

あなたはそのindexPathForRowAtPoint:方法がうまくいかなかったと言いました。これは、ほぼ間違いなく、あなたが通過しているポイントの問題です。の値をログアウトしてbillToPostalCell.center、正当な値を渡していることを確認してください。ただし、静的セルを扱っている場合は、(少なくとも最初のセルの削除では) インデックス パスを既に知っているはずなので、実際にはこれを行う必要はありません。

他の人が述べたように、セルの削除に関するドキュメントには、必要なすべての追加情報が記載されています。

于 2013-04-22T22:47:35.773 に答える