34

私が取り組んでいるアプリには、ゼロ行を含むセクションを含めることができるプレーンスタイルのUITableViewがあります。scrollToRowAtIndexPath:atScrollPosition:animated:を使用してこのセクションにスクロールできるようにしたいのですが、子行がないためにこのセクションにスクロールしようとするとエラーが発生します。

Appleのカレンダーアプリケーションはこれを行うことができます。カレンダーをリストビューで見て、今日のカレンダーにイベントがない場合、今日の空のセクションが挿入され、ツールバーの[今日]ボタンを使用してスクロールできます。画面の下部にあります。私が知る限り、AppleはカスタマイズされたUITableViewを使用しているか、プライベートAPIを使用している可能性があります...

私が考えることができる唯一の回避策は、高さ0ピクセルの空のUITableCellを挿入し、そこまでスクロールすることです。しかし、さまざまな高さのセルがあると、スクロールのパフォーマンスが非常に悪くなることを理解しています。それでも私はとにかくそれを試してみます、多分パフォーマンスヒットはそれほど悪くないでしょう。

アップデート

これに対する解決策がないように思われるので、私はアップルにバグレポートを提出しました。これがあなたにも影響を与える場合、これをより早く修正したい場合は、rdar:// problem / 6263339(レーダーリンクを開く)の複製を提出してください。

アップデート#2

私はこの問題に対してまともな回避策を持っています。以下の私の答えを見てください。

4

6 に答える 6

122

更新: このバグは iOS 3.0 で修正されたようです。以下を使用して、NSIndexPath0 行を含むセクションまでスクロールできます。

[NSIndexPath indexPathForRow:NSNotFound inSection:section]

2.x SDK を使用してプロジェクトを維持しているすべての人のために、元の回避策をここに残しておきます。


まともな回避策を見つけました:

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
[tableView scrollRectToVisible:sectionRect animated:YES];

上記のコードは、目的のセクションが表示されるようにテーブルビューをスクロールしますが、必ずしも表示領域の上部または下部にあるとは限りません。セクションが一番上になるようにスクロールしたい場合は、次のようにします。

CGRect sectionRect = [tableView rectForSection:indexOfSectionToScrollTo];
sectionRect.size.height = tableView.frame.size.height;
[tableView scrollRectToVisible:sectionRect animated:YES];

必要に応じて sectionRect を変更して、目的のセクションを表示領域の下部または中央までスクロールします。

于 2008-12-08T22:07:18.607 に答える
4

これは古い質問ですが、セクションに行がない場合のクラッシュ バグを解決したり修正したりするものを Apple はまだ追加していません。

私にとっては、新しいセクションを追加するときに中央までスクロールする必要があったため、次のコードを使用します。

if (rowCount > 0) {
    [self.tableView scrollToRowAtIndexPath: [NSIndexPath indexPathForRow: 0 inSection: sectionIndexForNewFolder] 
                          atScrollPosition: UITableViewScrollPositionMiddle
                                  animated: TRUE];
} else { 
    CGRect sectionRect = [self.tableView rectForSection: sectionIndexForNewFolder];
    // Try to get a full-height rect which is centred on the sectionRect
    // This produces a very similar effect to UITableViewScrollPositionMiddle.
    CGFloat extraHeightToAdd = sectionRect.size.height - self.tableView.frame.size.height;
    sectionRect.origin.y -= extraHeightToAdd * 0.5f;
    sectionRect.size.height += extraHeightToAdd;
    [self.tableView scrollRectToVisible:sectionRect animated:YES];
}

気に入っていただければ幸いです - ご覧のとおり、Mike Akers のコードに基づいていますが、上ではなく中央にスクロールするための計算を行います。ありがとうマイク - あなたはスターです。

于 2012-05-28T10:01:45.513 に答える
-1

おそらく空白行がそこに行く唯一の方法だと思います。「空の」行に何か便利なものを表示できるようにUIを再設計することは可能ですか?

試してみて、パフォーマンスがどうなるか見てみましょう。彼らはあなたのリストアイテムで透明なサブビューを使用することについてかなり悲惨な警告を出します、そして私はそれが私のアプリケーションでそれほど重要であるとは思いませんでした。

于 2008-10-01T21:30:07.857 に答える