このスレッドを見てください:静的セルを非表示にする
プログラムで静的セルを非表示にする方法について説明します。受け入れられた答えは次のとおりです。
1.セルを非表示にします
セルを直接隠す方法はありません。UITableViewControllerは静的セルを提供するデータソースであり、現在、「セルxを提供しない」と伝える方法はありません。したがって、静的セルを取得するためにUITableViewControllerに委任する独自のデータソースを提供する必要があります。
最も簡単なのは、UITableViewControllerをサブクラス化し、セルを非表示にするときに異なる動作をする必要があるすべてのメソッドをオーバーライドすることです。
最も単純なケース(単一セクションテーブル、すべてのセルの高さが同じ)では、次のようになります。
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [super tableView:tableView numberOfRowsInSection:section] - numberOfCellsHidden; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// Recalculate indexPath based on hidden cells
indexPath = [self offsetIndexPath:indexPath];
return [super tableView:tableView cellForRowAtIndexPath:indexPath]; }
- (NSIndexPath*)offsetIndexPath:(NSIndexPath*)indexPath {
int offsetSection = indexPath.section; // Also offset section if you intend to hide whole sections
int numberOfCellsHiddenAbove = ... // Calculate how many cells are hidden above the given indexPath.row
int offsetRow = indexPath.row + numberOfCellsHiddenAbove;
return [NSIndexPathindexPathForRow:offsetRow inSection:offsetSection]; }
テーブルに複数のセクションがある場合、またはセルの高さが異なる場合は、より多くのメソッドをオーバーライドする必要があります。ここでも同じ原則が当てはまります。superに委任する前に、indexPath、section、rowをオフセットする必要があります。
また、didSelectRowAtIndexPath:などのメソッドのindexPathパラメーターは、状態(つまり、非表示になっているセルの数)に応じて、同じセルで異なることに注意してください。したがって、indexPathパラメータを常にオフセットして、これらの値を操作することをお勧めします。
2.変更をアニメーション化します
Garethがすでに述べたように、reloadSections:withRowAnimation:メソッドを使用して変更をアニメーション化すると、大きな不具合が発生します。
その直後にreloadData:を呼び出すと、アニメーションが大幅に改善されることがわかりました(わずかな不具合のみが残っています)。アニメーションの後、テーブルは正しく表示されます。
だから私がしているのは:
- (void)changeState {
// Change state so cells are hidden/unhidden
...
// Reload all sections
NSIndexSet* reloadSet = [NSIndexSetindexSetWithIndexesInRange:NSMakeRange(0, [self numberOfSectionsInTableView:tableView])];
[tableView reloadSections:reloadSet withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView reloadData]; }
これが役に立ったら、あそこに行って、henning77の答えに投票してください。