私は、現在の月の費用を表示する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;
}
セバスチャン
どうしたら– 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
}
適切なセクションの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
}
}
私の奇妙な状況では、私は帰らなければなりません:
viewForHeaderInSection-> nil
viewForFooterInSection-> nil (フッターを忘れないでください!)
heightForHeaderInSection-> .01(ゼロではない!)
heightForFooterInSection-> 0.01
この場合のみ、空のセクションは完全に消えます
メソッドを見てください -[UITableViewDelegate tableView:heightForHeaderInSection:]
。特に、そのドキュメントに付随するメモ:
IOS 5.0より前のテーブルビューでは、
tableView:viewForHeaderInSection:
はnil
ビューを返しました。 iOS 5.0以降では、このメソッドで各セクションヘッダーの実際の高さを返す必要があります。
これは古い質問ですが、追加したいと思います。 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
}
}
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;
}
}
これは適切な方法のようです、それは正しくアニメーションし、きれいに動作します... Apple意図した...
tableViewデリゲートに適切な情報を提供する
セクションにアイテムがない場合、次の場所に0.0fを返します。
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
..また、nilを返します:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
tableViewの適切なデータ削除を行う
[tableView beginUpdates];
を呼び出しますdeleteRowsAtIndexPaths
を呼び出します。reloadSections:
を呼び出して、そのセクションをリロードします。これにより、正しいアニメーションがトリガーされ、ヘッダーが非表示/スライド/フェードされます。[tableView endUpdates];
を呼び出して、更新を終了します。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)
}