Ich habe eine UITableView, die Ausgaben von einem aktuellen Monat anzeigt (siehe Screenshot):
Mein Problem ist mit der Kopfzeile für leere Abschnitte. Gibt es eine Möglichkeit, sie zu verstecken? Die Daten werden aus Coredata geladen.
Dies ist der Code, der den Headertitel generiert:
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;
}
Sebastian
objective-c
ios
uitableview
tableview
Sebastian Flückiger
quelle
quelle
return nil;
intitleForHeaderInSection
ist ausreichend für mich (nachdem ichcount > 0
natürlich nach diesem AbschnittSie müssen
tableView:heightForHeaderInSection:
für die entsprechenden Abschnitte auf 0 setzen . Dies ist etwas, das sich vor kurzem geändert hat und mich an ein paar Stellen gebracht hat. DarausUITableViewDelegate
steht ...Also musst du so etwas tun
- (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 } }
quelle
title
. Wenn Sie atitle
festlegen, müssen Sie gegebenenfallsnil
für den Methodenaufruf zurückkehrentableView:titleForHeaderInSection:
. Wenn Sie benutzerdefinierte Header-Ansichten verwenden, müssen Sie diese überschreibenviewForHeaderInSection
. Wenn Sie das tun, sollte dieser Code funktionieren. Wenn nicht, würde ich weitere Informationen benötigen, um bei dem Problem zu helfen.UIView
else
{
vw = [[UIView alloc]init];
[vw setHidden:YES];
}
In meiner seltsamen Situation muss ich zurückkehren:
nur in diesem Fall verschwinden leere Abschnitte vollständig
quelle
0.01
... einstellen . IOS hat einige seltsame Fehler.Schauen Sie sich die Methode an
-[UITableViewDelegate tableView:heightForHeaderInSection:]
. Insbesondere der Hinweis, der der Dokumentation beigefügt ist:quelle
Ich weiß, dass dies eine alte Frage ist, aber ich möchte sie ergänzen. Ich bevorzuge den Ansatz, den
titleHeader
Wert auf Null zu setzen , anstatt den WertheightForHeaderInSection
auf 0 zu setzen, da dies zu Problemen mitindexPath
+1 führen kann, da der Header immer noch vorhanden, aber verborgen ist.Wenn dies gesagt ist und Sie auf der Antwort von DBD aufbauen , können Sie
titleForHeaderInSection:
für Abschnitte ohne Zeilen wie folgt den Wert auf Null setzen :- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { if ([tableView.dataSource tableView:tableView numberOfRowsInSection:section] == 0) { return nil; } else { // return your normal return } }
quelle
Im Jahr 2015 mit iOS 8 und Xcode 6 hat Folgendes für mich funktioniert:
/* 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; } }
quelle
Dies scheint der richtige Weg zu sein. Es wird korrekt animiert und funktioniert sauber ... wie von Apple beabsichtigt ...
Stellen Sie dem tableView-Delegaten die entsprechenden Informationen zur Verfügung
Wenn keine Elemente im Abschnitt vorhanden sind, geben Sie 0.0f in zurück:
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
..Auch zurück Null für:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
Führen Sie die entsprechende Datenentfernung für tableView durch
[tableView beginUpdates];
deleteRowsAtIndexPaths
mit den indexPaths der Zellen auf, die Sie entfernt haben.reloadSections:
an, um diesen Abschnitt neu zu laden. Dadurch wird die richtige Animation ausgelöst und der Header ausgeblendet / verschoben / ausgeblendet.[tableView endUpdates];
an, um das Update abzuschließen.quelle
reloadSections
? Ich habe festgestellt, dass sich meine Kopfzeilen der Tabellenansicht überlappen, wenn ich sie nicht aufrufe (bis ich einen Bildlauf durchführe, wird die richtige Kopfzeile angezeigt).Swift 4.2
Setzen Sie heightForHeaderInSection auf Null. Wenn Sie eine benutzerdefinierte Schnittansicht haben, setzen Sie sie für Abschnitte ohne Zellen auf Null.
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) }
quelle