web-dev-qa-db-ja.com

UITableView:空のセクションからヘッダーを非表示

私は、現在の月の費用を表示するUITableViewを持っています(スクリーンショットを参照):

私の問題は、空のセクションのヘッダーにあります。それらを隠す方法はありますか?データはcoredataからロードされます。

これは、ヘッダータイトルを生成するコードです。

TitleForHeader

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
    return nil;
} else {

NSDate *today = [NSDate date ];
int todayInt = [dataHandler getDayNumber:today].intValue;

NSDate *date = [NSDate dateWithTimeIntervalSinceNow:(-(todayInt-section-1)*60*60*24)];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]]];    
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
NSString *formattedDateString = [dateFormatter stringFromDate:date];
    return formattedDateString;}

}

ViewForHeader

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
    return nil;
} else {

    UIView *headerView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 312, 30)];
    UILabel *title = [[UILabel alloc]initWithFrame:CGRectMake(4, 9, 312, 20)];
    UIView *top = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 312, 5)];
    UIView *bottom = [[UIView alloc]initWithFrame:CGRectMake(0, 5, 312, 1)];

    [top setBackgroundColor:[UIColor lightGrayColor]];
    [bottom setBackgroundColor:[UIColor lightGrayColor]];

    [title setText:[expenseTable.dataSource tableView:tableView titleForHeaderInSection:section]];
    [title setTextColor:[UIColor darkGrayColor]];
    UIFont *fontName = [UIFont fontWithName:@"Cochin-Bold" size:15.0];
    [title setFont:fontName];


    [headerView addSubview:title];
    [headerView addSubview:top];
    [headerView addSubview:bottom];

    return headerView;

}

}

heightForHeader

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {

NSLog(@"Height: %d",[tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0);
if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section == 0]) {
    return 0;
} else {
    return 30;
}
}

numberOfRowsInSection

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {

int rows = 0;
for (Expense* exp in [dataHandler allMonthExpenses]) {
    if ([exp day].intValue == section) {
        rows++;
    }
}

return rows;
}

enter image description here セバスチャン

72

どうしたら– tableView:viewForHeaderInSection: 君は return nilセクションカウントが0の場合。

[〜#〜] edit [〜#〜]:セクション内の要素数を取得するためにnumberOfRowsInSectionを使用できます。

[〜#〜] edit [〜#〜]titleForHeaderInSectionが0の場合、numberOfRowsInSectionにもnilを返す必要があります。

[〜#〜] edit [〜#〜]:次のメソッドを実装しましたか?

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

[〜#〜] edit [〜#〜]Swiftの例

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    switch section {
    case 0:
        if self.tableView(tableView, numberOfRowsInSection: section) > 0 {
            return "Title example for section 1"
        }
    case 1:
        if self.tableView(tableView, numberOfRowsInSection: section) > 0 {
            return "Title example for section 2"
        }
    default:
        return nil // when return nil no header will be shown
    }
    return nil
}
56
LuisEspinoza

適切なセクションのtableView:heightForHeaderInSection:を0に設定する必要があります。これはかなり最近変更されたもので、私をいくつかの場所に連れてきました。 UITableViewDelegateから...

IOS 5.0より前のバージョンでは、tableView:viewForHeaderInSection:がnilビューを返したセクションのテーブルビューは、ヘッダーの高さを自動的に0に変更していました。 iOS 5.0以降では、このメソッドで各セクションヘッダーの実際の高さを返す必要があります。

だからあなたは次のようなことをしなければなりません

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
        return 0;
    } else {
        // whatever height you'd want for a real section header
    }
}
132
DBD

私の奇妙な状況では、私は帰らなければなりません:

viewForHeaderInSection-> nil

viewForFooterInSection-> nil (フッターを忘れないでください!)

heightForHeaderInSection-> .01(ゼロではない!)

heightForFooterInSection-> 0.01

この場合のみ、空のセクションは完全に消えます

53
djdance

メソッドを見てください -[UITableViewDelegate tableView:heightForHeaderInSection:] 。特に、そのドキュメントに付随するメモ:

IOS 5.0より前のテーブルビューでは、tableView:viewForHeaderInSection:nilビューを返しました。 iOS 5.0以降では、このメソッドで各セクションヘッダーの実際の高さを返す必要があります。

10
Sixten Otto

これは古い質問ですが、追加したいと思います。 titleHeaderを0に変更するよりも、heightForHeaderInSectionをnilに設定するアプローチが好きです。なぜなら、indexPathが+1であるという問題を引き起こす可能性があるからです。

そのため、 DBDの答え に基づいて、titleForHeaderInSection:は、次のように行のないセクションではnilになります。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
        return nil;
    } else {
        // return your normal return
    }
}
9
gav

2015年にiOS 8とXcode 6を使用すると、次のことがうまくいきました。

/* Return the title for each section if and only if the row count for each section is not 0. */

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{

    if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) {
        return nil;
    }else{

    // here you want to return the title or whatever string you want to return for the section you want to display

    return (SomeObject*)someobjectArray[section].title;
    }
}
7
Ronaldoh1

これは適切な方法のようです、それは正しくアニメーションし、きれいに動作します... Apple意図した...

tableViewデリゲートに適切な情報を提供する

セクションにアイテムがない場合、次の場所に0.0fを返します。

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section

..また、nilを返します:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

tableViewの適切なデータ削除を行う

  1. [tableView beginUpdates];を呼び出します
  2. DataSourceからアイテムを削除し、要素が削除された場所を追跡します。
  3. 削除したセルのindexPathを使用してdeleteRowsAtIndexPathsを呼び出します。
  4. データソースにアイテムが含まれていない場合(ここではヘッダーのみになります)。 reloadSections:を呼び出して、そのセクションをリロードします。これにより、正しいアニメーションがトリガーされ、ヘッダーが非表示/スライド/フェードされます。
  5. 最後に[tableView endUpdates];を呼び出して、更新を終了します。
5
Andres Canella

Swift 4.2

HeightForHeaderInSectionをゼロに設定し、カスタムセクションビューがある場合は、セルのないセクションではnilに設定します。

func tableView(_ tableView: UITableView,
                   heightForHeaderInSection section: Int) -> CGFloat {
        return height_DefaultSection
    }

func tableView(_ tableView: UITableView,
                   viewForHeaderInSection section: Int) -> UIView? {

        return tableView.dataSource?.tableView(tableView, numberOfRowsInSection: section) == 0 ? nil: headerView(tableView: tableView, section: section)
    }
2
user550088