web-dev-qa-db-ja.com

UITableViewでセクションを非表示にする方法は?

表にデータが含まれていないセクションがあり、そのセクションを非表示にしたい。

これを行う方法?

26
Teo Choong Ping

このようにセクションを「非表示」にすることはできませんが、deleteSections:withRowAnimation:メソッドを使用して、テーブルビューからセクションを「削除」できます。これにより、バッキングデータに影響を与えることなく、オプションのアニメーションでビューから削除されます。 (ただし、セクションが再表示されないように、データを更新する必要があります。)

詳細: ITableViewクラスリファレンス

22
Tim

実際には、セクションを「隠す」ことができます。組み込みの連絡先アプリと同様の動作を使用したい場合、セクションは非表示になっていますが、右側のインデックスにリストされていますが、次のことができます。

UITableViewDataSourceプロトコルを実装します。

  • すべてのセクション名(非表示のものも含む)を-sectionIndexTitlesForTableViewメソッドで返します。

  • 空のセクションごとに、nilメソッドからtitleForHeaderInSectionを返します。

  • 空のセクションごとに、numberOfRowsInSectionメソッドの0を返します。

ユーザーが一貫したインデックスナビゲーションを持っているので、これはセクションを削除するよりもうまくいくと思います。

52
TJez

0はヘッダーとフッターの有効な高さではないことは事実です。ただし、高さはCGFloat値です。セクションのヘッダーとフッターの高さには、非常に小さな数値(私は0.1を使用しました)を指定できます。

ハックのようなものですが、動作します。

14
marcus

私はティムに同意しません。コードのどこからでもテーブルのセクション/行にアクセスし、その.hiddenプロパティ(およびその他すべてのプロパティ)を変更する方法があります。

これは私が通常使う方法です:

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:2];
[self.SeymourCakesTableView cellForRowAtIndexPath:indexPath].hidden = YES;
5
Deepukjayan

そのセクションの行数を0に設定できます。ただし、以前のように目立つ空白領域が残ります。

2
Cocoanut

_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をサブルーチンの複数の呼び出しで使用することになります。古き良きスイッチ方法を考えてよかった、多分それもあなたに役立つ:-)

2
Maarten Wolzak

セクションの高さとして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
ariauakbar

おそらく、テーブルを支えるデータからセクション自体を削除する必要があります。セクションを非表示にできるものはないと思います。

1
Simon

静的テーブルの場合、つまり、テーブルセクションとセルはストーリーボードで構成されます。以下は、条件に応じて指定したセクションを非表示にする私の戦略です。

ステップ1funcで定義された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からの動的データに対して機能する可能性があると思います。このようにして、特定のセクションをいつ表示または非表示にするかを制御できます。

0
David.Chu.ca

このようにしてみてください:-

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    CGFloat headerHeight=10.f;
    if (section==0)
    {
        headerHeight=0.01f;
    }
    else
    {
        headerHeight=50.0f;
    }
    return headerHeight;
}
0
Hussain Shabbir

セクションを非表示にするには、テーブルビューの途中でも、次のすべてが必要です。

#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を省略した場合...タイトル/フッターヘッダーテキストは引き続き表示されます

0
Hofi