web-dev-qa-db-ja.com

静的TableViewのセクションを非表示にする

静的TableViewのセクションを非表示にするこのチュートリアルを見つけました: http://code-ninja.org/blog/2012/02/29/ios-quick-tip-programmatically-hiding-sections-of -a-uitableview-with-static-cells /

それはうまく機能しますが、それを変更せずにのみ、セクションまたは行を追加すると、うまく機能しません。私は初心者ですが、変更することはできません。誰かが複数のセクションを非表示にするのを手伝ってくれますか?

どうもありがとうございます!

20
Matte.Car
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {            
    if (section == 2 && _hideTableSection) {
        //header height for selected section
        return 0.1; 
    } else {
        //keeps all other Headers unaltered 
        return [super tableView:tableView heightForHeaderInSection:section]; 
    }  
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {        
    if (section == 2 && _hideTableSection) {
        //header height for selected section
        return 0.1; 
    } else {
        // keeps all other footers unaltered
        return [super tableView:tableView heightForFooterInSection:section]; 
    } 
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section == 1) { //Index number of interested section
        if (hideTableSection) {
            return 0; //number of row in section when you click on hide
        } else {
            return 2; //number of row in section when you click on show (if it's higher than rows in Storyboard, app will crash)
        }
    } else {
        return [super tableView:tableView numberOfRowsInSection:section]; //keeps inalterate all other rows 
    }    
}
43
Matte.Car

たくさんの答えを掘り下げて多くの不具合にぶつかった後、この問題を解決するために書いたコードを共有したいと思いました。これはxCode7.2.1用です。 (Swiftのコード例)

私のユースケースは、ストーリーボードの静的にグループ化されたTableViewの使いやすさを使用したいというものでしたが、ユーザープロファイルに基づいて特定のセクションを非表示にする必要がありました。これを機能させるには(他の投稿で説明されているように)、ヘッダーとフッター、セクションの行を非表示にし、ヘッダー/フッターのテキストを非表示にする必要があります(少なくとも上部のセクション)。テキストを非表示(透明にする)にしないと、ユーザーはテーブルの上部(ナビゲーションコントローラーの下)を超えて上にスクロールし、テキストがすべて詰め込まれているのを見ることができることがわかりました。

これを簡単に変更できるようにしたいので、コード全体に条件を広げたくなかったので、shouldHideSection(section:Int)という単一の関数を作成しました。これは、非表示にする行を変更するために変更する必要がある唯一の関数です。

func shouldHideSection(section: Int) -> Bool {
    switch section {
    case 0:  // Hide this section based on condition below
        return user!.isProvider() ? false : true

    case 2:
        return someLogicForHiddingSectionThree() ? false : true

    default:
        return false
    }
}

これで、コードの残りの部分はshouldHideSection()を呼び出すだけです。

// Hide Header(s)
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return shouldHideSection(section) ? 0.1 : super.tableView(tableView, heightForHeaderInSection: section)
}

// Hide footer(s)
override func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return shouldHideSection(section) ? 0.1 : super.tableView(tableView, heightForFooterInSection: section)
}

// Hide rows in hidden sections
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return shouldHideSection(indexPath.section) ? 0 : super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}

// Hide header text by making clear
override func tableView(tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if shouldHideSection(section) {
        let headerView = view as! UITableViewHeaderFooterView
        headerView.textLabel!.textColor = UIColor.clearColor()
    }
}

// Hide footer text by making clear
override func tableView(tableView: UITableView, willDisplayFooterView view: UIView, forSection section: Int) {
    if shouldHideSection(section) {
        let footerView = view as! UITableViewHeaderFooterView
        footerView.textLabel!.textColor = UIColor.clearColor()
    }
}

最終的に満足のいくソリューションを得るには、さまざまな値(0、0.1、-1、...を返す)を試してみる必要がありました(少なくともiOS 9.xでは)。

これがお役に立てば幸いです。改善を提案された場合はお知らせください。

17
KeithB

Swift 3

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    if section == 2 && hideTableSection {
        //header height for selected section
        return 0.1
    }

    //keeps all other Headers unaltered 
    return super.tableView(tableView, heightForHeaderInSection: section)
}

override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {

    if section == 2 && hideTableSection {
        //header height for selected section                
        return 0.1
    }

    return super.tableView(tableView, heightForFooterInSection: section)
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    if section == 1 { //Index number of interested section
        if hideTableSection {
            return 0 //number of row in section when you click on hide
        } else {
            return 2 //number of row in section when you click on show (if it's higher than rows in Storyboard, app will crash)
        }
    } else {
        return super.tableView(tableView, numberOfRowsInSection: section) //keeps inalterate all other rows 
    }
}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {

    if section == 2 && hideTableSection {
        return ""
    }

    return super.tableView(tableView, titleForHeaderInSection: section)
}

override func tableView(_ tableView: UITableView, titleForFooterInSection section: Int) -> String? {

    if section == 2 && hideTableSection {
        return ""
    }

    return super.tableView(tableView, titleForFooterInSection: section)
}
2
pableiros

セクションの高さとして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.01に設定します。非表示にするセクションは、次の方法で試すことができます。-

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

ストーリーボードからセクションヘッダーのタイトルを消去すると、自動的に消えます。つまり、タイトルの内容だけでなく、それが占めるスペースも意味します。

0
andrei