0

表示されているテキストに応じて、UITableViewCellの高さのサイズを変更しようとしています。テキストを完全に表示したい。

cellForRowAtIndexPathに、特定のTEXT_CELLラベルを持つセルを作成します

if ([rowType isEqualToString:kTextCell] ) {

        cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

        // Create a text view;
        UITextView *newText = [[UITextView alloc] initWithFrame:CGRectZero];
        newText.backgroundColor = [UIColor blueColor];
        newText.tag = kNotesTag;
        newText.editable = NO;
        newText.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

        cell.contentView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:newText];

        [newText release];
}

そして、セルを表示するとき、sizeOfFont関数を使用してすべてのテキストを表示するために必要なサイズを計算します。次に、そのサイズを変数として設定します。これは、heightOfCell関数で使用されます。

    UITextView *notes = (UITextView*) [cell viewWithTag:kNotesTag];

    if (notes != nil) {
        notes.text = [self.managedObject dispalyValueForKeyPath:rowKey];

        // resize it to the right height          
        CGRect contentFrame = cell.contentView.frame;

        CGSize textSize = [notes.text sizeWithFont:[UIFont systemFontOfSize:[UIFont systemFontSize]] 
                                 constrainedToSize:CGSizeMake(contentFrame.size.width, CGFLOAT_MAX) 
                                     lineBreakMode:UILineBreakModeWordWrap];   

        CGFloat newHeight = textSize.height + (CELL_CONTENT_MARGIN*2); //some space at the bottom

        CGFloat textHeight = self.storedTextHeight;            

        if (textHeight != newHeight) {

            [notes setFrame:CGRectMake(contentFrame.origin.x, 
                                       CELL_CONTENT_MARGIN+contentFrame.origin.y, 
                                       contentFrame.size.width, newHeight)];

            self.storedTextHeight = newHeight;

            // we reset the height fo the row, so reload it
            [tView beginUpdates];
            [tView endUpdates];  

        }

計算は期待どおりに機能し、heightForRowが呼び出され、セルの高さが更新されます。ただし、常に[tViewendUpdates]行でSIGABTを取得します。

エラーメッセージは以下のとおりです。私はたくさんグーグルで検索しましたが、なぜそうなるのかはっきりしていません。セルを作成または追加しません。

*キャッチされなかった例外によるアプリの終了'NSInternalInconsistencyException'、理由:'無効な更新:セクション0の行数が無効です。更新後の既存のセクションに含まれる行数(1)は、に含まれる行数と同じである必要があります更新前のそのセクション(2)、そのセクションから挿入または削除された行の数(0が挿入、0が削除)、およびプラスまたはマイナスがそのセクションに出入りした行の数(0が入、0)引っ越した)。'

これについての洞察に感謝します。

4

1 に答える 1

1

クラッシュレポートは、問題がサイズ変更戦略に起因していない可能性があることを示しています。行数が変化していると表示されますが、自分で行数を変更しているわけではありません。これは、テーブルをリロードする方法が原因で発生しています。

テーブルビューをリロードするには、との代わりに[tViewreloadData]を呼び出す必要が-beginUpdatesあり-endUpdatesます。

andを使用する-beginUpdates-endUpdates、テーブルビューは、テーブルに手動で変更を加えていると見なします-deleteRowsAtIndexPaths:withRowAnimation:。それを行っていない場合(実際に自分で更新を行っていない場合は、そうではありません)、を呼び出す必要があります-reloadData-beginUpdatesとを使用する場合-endUpdatesは、2つの呼び出しの間に次を挿入できます。

[tView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:firstIndexPathToDelete, 
    someOtherIndexPathToDelete, maybeOneMoreIndexPathToDelete, nil] 
    withRowAnimation:UITableViewRowAnimationFade];

とへの呼び出しの-beginUpdates-endUpdates

編集:

のパフォーマンスを向上-reloadDataさせるには、で多くの重労働を行っていないこと-cellForRowAtIndexPath:、およびセルを再利用していることを確認する必要があります。テーブルビューのパフォーマンスに関する記事はインターネット上にたくさんあります。

UITableViewのreloadDataはどれくらい高価ですか?

tableViewのreloadDataにより、パフォーマンスが低下します

ここでの議論

于 2012-07-16T15:12:51.197 に答える