表にデータが含まれていないセクションがあり、そのセクションを非表示にしたい。
これを行う方法?
このようにセクションを「非表示」にすることはできませんが、deleteSections:withRowAnimation:
メソッドを使用して、テーブルビューからセクションを「削除」できます。これにより、バッキングデータに影響を与えることなく、オプションのアニメーションでビューから削除されます。 (ただし、セクションが再表示されないように、データを更新する必要があります。)
実際には、セクションを「隠す」ことができます。組み込みの連絡先アプリと同様の動作を使用したい場合、セクションは非表示になっていますが、右側のインデックスにリストされていますが、次のことができます。
UITableViewDataSource
プロトコルを実装します。
すべてのセクション名(非表示のものも含む)を-sectionIndexTitlesForTableView
メソッドで返します。
空のセクションごとに、nil
メソッドからtitleForHeaderInSection
を返します。
空のセクションごとに、numberOfRowsInSection
メソッドの0
を返します。
ユーザーが一貫したインデックスナビゲーションを持っているので、これはセクションを削除するよりもうまくいくと思います。
0はヘッダーとフッターの有効な高さではないことは事実です。ただし、高さはCGFloat値です。セクションのヘッダーとフッターの高さには、非常に小さな数値(私は0.1を使用しました)を指定できます。
ハックのようなものですが、動作します。
私はティムに同意しません。コードのどこからでもテーブルのセクション/行にアクセスし、その.hiddenプロパティ(およびその他すべてのプロパティ)を変更する方法があります。
これは私が通常使う方法です:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES;
そのセクションの行数を0に設定できます。ただし、以前のように目立つ空白領域が残ります。
_numberofSectionsInTableView:
_メソッドからデータを含むレコードの数を返し、switch(indexPath.section)
を使用して空のレコードを次のスイッチに「フォールスルー」することもできます。
_- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section) {
case 0:
return <header cell>;
break;
case 1:
if(firstRecordHasData){
return <second cell>;
break;
}
case 2:
if(secondRecordHasData){
return <second cell>;
break;
}
case 3:
return <some other cell>;
break;
default:
return <a regular cell>;
break;
}
}
_
グループ化されたテーブルの中央にあるセクションを除外する必要があったため、しばらくの間これに苦労していました。セル、ヘッダー、フッターの高さを0.0に設定してみましたが、機能しませんでした。選択された行に応じて呼び出されるメソッドが原因で、特定のセクションを削除できませんでした。これは巨大なif..else if ... else ifをサブルーチンの複数の呼び出しで使用することになります。古き良きスイッチ方法を考えてよかった、多分それもあなたに役立つ:-)
セクションの高さとして0を返すと、Apple APIはそれを無視します。そのため、0より大きい小さな値を返すだけです。
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (section == 0) {
return 1;
}
return 44;
}
また、ヘッダーのビューを実装し、表示したくないセクションのnilを返します。
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if (section == 0 && !self.personaCells.count) {
return nil;
}
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 44)];
UILabel *headerLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 20, headerView.frame.size.width, 20)];
NSString *headerTitle = @"SAMPLE TITLE";
headerLabel.text = headerTitle;
[headerView addSubview:headerLabel];
return headerView;
}
特定のセクション行の高さを0に設定できます。また、必要に応じてセクションヘッダーを使用します。データソースはまだ存在し、表示されないだけです。
セクション行
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.section == 0) {
if (_shouldHidden) {
return 0.0;
}
else {
return 55.0;
}
}
else {
return 55.0;
}
}
おそらく、テーブルを支えるデータからセクション自体を削除する必要があります。セクションを非表示にできるものはないと思います。
静的テーブルの場合、つまり、テーブルセクションとセルはストーリーボードで構成されます。以下は、条件に応じて指定したセクションを非表示にする私の戦略です。
ステップ1:func
で定義された2つのUITableViewDelegate
を実装します-heightForRowAt
-heightForHeaderInSection
たとえば、Swiftコード:
_override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
// if indexPath contains the specified section AND
// the condition for hiding this section is `true`
// return CGFloat(0)
// else
// return super.tableView(tableView, heightForRowAt: indexPath)
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
// similar logic to set header height
}
_
ステップ2:特定のセクションで非表示のセルを設定する関数を定義し、それをviewWillAppearから呼び出します。
_private func setSectionVisible()
{
/*
if condition for visible is true
let index = IndexPath(row:..., section:...)
let cell = self.tableView.cellForRow(at: index)
cell.isHiden = true
*/
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.setSectionVisible()
}
_
Tableviewを再ロードする必要がある場合は、setSectionVisible()
を再度呼び出す必要があります。
この戦略は、DataSourceからの動的データに対して機能する可能性があると思います。このようにして、特定のセクションをいつ表示または非表示にするかを制御できます。
このようにしてみてください:-
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
CGFloat headerHeight=10.f;
if (section==0)
{
headerHeight=0.01f;
}
else
{
headerHeight=50.0f;
}
return headerHeight;
}
セクションを非表示にするには、テーブルビューの途中でも、次のすべてが必要です。
#define DEBUG_SECTION 1
#if ! DEBUG_BUILD
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return CGFLOAT_MIN;
return [super tableView:tableView heightForHeaderInSection:section];
}
//------------------------------------------------------------------------------
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return CGFLOAT_MIN;
return [super tableView:tableView heightForFooterInSection:section];
}
//------------------------------------------------------------------------------
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return nil;
return [super tableView:tableView titleForHeaderInSection:section];
}
//------------------------------------------------------------------------------
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return nil;
return [super tableView:tableView titleForFooterInSection:section];
}
//------------------------------------------------------------------------------
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if (section == DEBUG_SECTION)
return 0;
return [super tableView:tableView numberOfRowsInSection:section];
}
//------------------------------------------------------------------------------
#endif // #if ! DEBUG_BUILD
titleFor/headerFor ...を省略した場合、いくつかの空の行が表示されます
heightForを省略した場合...タイトル/フッターヘッダーテキストは引き続き表示されます