UITableView mit festen Abschnittsüberschriften


105

Grüße, ich lese, dass das Standardverhalten darin UITableViewbesteht, Abschnittsüberschriftenzeilen an den oberen Rand der Tabelle zu heften, während Sie durch die Abschnitte scrollen, bis der nächste Abschnitt die vorherige Abschnittszeile aus der Ansicht verdrängt.

Ich habe ein UITableViewInside A UIViewControllerund dies scheint nicht der Fall zu sein.

Ist das nur das falsche Verhalten für UITableViewController?

Hier ist ein vereinfachter Code, der auf dem basiert, was ich habe. Ich zeige die UIControllerBenutzeroberfläche und jede Tabellenansichtsmethode, die ich zum Erstellen der Tabellenansicht implementiert habe. Ich habe eine Hilfsdatenquellenklasse, mit deren Hilfe ich meine Objekte für die Verwendung mit der Tabelle indizieren kann.

    @interface MyUIViewController ()<UITableViewDelegate, UITableViewDataSource>
        @property (nonatomic, readonly) UITableView *myTableView;
        @property (nonatomic, readonly) MyCustomHelperDataSource *helperDataSource;
    @end

    //when section data is set, get details for each section and reload table on success
    - (void)setSectionData:(NSArray *)sections {
        super.sectionData = sections; //this array drives the sections

        //get additional data for section details
        [[RestKitService sharedClient] getSectionDetailsForSection:someId 
        success:^(RKObjectRequestOperation *operation, RKMappingResult *details) {
            NSLog(@"Got section details data");
            _helperDataSource = [[MyCustomHelperDataSource alloc] initWithSections:sections andDetails:details.array];
            [myTableView reloadData];
        } failure:^(RKObjectRequestOperation *operation, NSError *error) {
            NSLog(@"Failed getting section details");
        }];
    }

    #pragma mark <UITableViewDataSource, UITableViewDelegate>

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        if (!_helperDataSource) return 0;
        return [_helperDataSource countSectionsWithDetails]; //number of section that have details rows, ignore any empty sections
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        //get the section object for the current section int
        SectionObject *section = [_helperDataSource sectionObjectForSection:section];
        //return the number of details rows for the section object at this section
        return [_helperDataSource countOfSectionDetails:section.sectionId];
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        UITableViewCell * cell;

        NSString *CellIdentifier = @"SectionDetailCell";

        cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
            cell.textLabel.font = [UIFont systemFontOfSize:12.0f];
        }

        //get the detail object for this section
        SectionObject *section = [_helperDataSource sectionObjectForSection:indexPath.section]; 

        NSArray* detailsForSection = [_helperDataSource detailsForSection:section.sectionId] ;
        SectionDetail *sd = (SectionDetail*)[detailsForSection objectAtIndex:indexPath.row];

        cell.textLabel.text = sd.displayText;
        cell.detailTextLabel.text = sd.subText;
        cell.detailTextLabel.textColor = [UIColor blueTextColor];

        return cell;
    }

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 50.0f;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 30.0f;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section {
    //get the section object for the current section
    SectionObject *section = [_helperDataSource sectionObjectForSection:section]; 

    NSString *title = @"%@ (%d)";

    return [NSString stringWithFormat:title, section.name, [_helperDataSource countOfSectionDetails:section.sectionId]];
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 260, 0)];
    header.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    header.backgroundColor = [UIColor darkBackgroundColor];

    SSLabel *label = [[SSLabel alloc] initWithFrame:CGRectMake(3, 3, 260, 24)];
    label.font = [UIFont boldSystemFontOfSize:10.0f];
    label.verticalTextAlignment = SSLabelVerticalTextAlignmentMiddle;
    label.backgroundColor = [UIColor clearColor];
    label.text = [self tableView:tableView titleForHeaderInSection:section];
    label.textColor = [UIColor whiteColor];
    label.shadowColor = [UIColor darkGrayColor];
    label.shadowOffset = CGSizeMake(1.0, 1.0);
    [header addSubview:label];

    return header;
}

Das sollte funktionieren. Code anzeigen.
Matthias Bauch

Dies ist eine völlig gute Möglichkeit, eine UITableView zu verwenden, und sollte mit den Headern funktionieren. Was machen die Header in Ihrem Fall nicht?
Eric

@Eric die Überschriften scrollen mit den Zeilen. Sie halten nicht oben am Tisch an, während ich scrolle. Ich habe den Code hinzugefügt, mit dem ich meine Tabellenansicht generiere. Es ist eine UITableView in einem UIViewController.
Topwik

Antworten:


303

Die Header bleiben nur fest, wenn die UITableViewStyleEigenschaft der Tabelle auf gesetzt ist UITableViewStylePlain. Wenn Sie es eingestellt haben UITableViewStyleGrouped, werden die Überschriften mit den Zellen nach oben gescrollt.


3
Mein Tabellenansichtsstil ist UITableViewStylePlain, aber er scrollt auch mit den Zellen nach oben.
Yudun1989

8
Dafür gibt es ein paar mögliche Erklärungen. Ein wichtiger Hinweis ist, dass die Überschriften nur für Zellen in ihrem Abschnitt festgelegt bleiben. Wenn Sie also einen Header in Abschnitt 0 haben, bleibt dieser für Zellen in Abschnitt 1 nicht festgelegt. Eine weitere mögliche Erklärung ist, dass Sie Ihre UITableView nicht mit dem richtigen Stil initialisieren. Es wird empfohlen, dass Sie verwenden initWithStyle:UITableViewStylePlain, da der Aufruf von tableView.style = UITableViewStylePlain nicht funktioniert.
Bachonk

Mit UITableViewStyleGrouped wird die Kopf- / Fußzeile mit anderen Zellen korrigiert, während mit UITableViewStylePlain die Kopf- / Fußzeile "schwebt", wenn die Kopf- / Fußzeile den oberen / unteren Rand der Tabellenansicht erreicht.
StoneLam

@bachonk Ich verwende eine dehnbare Header-Ansicht. und mein Stil ist UITableViewStyleGrouped. Ich möchte den Header beim Scrollen nach oben korrigieren. Wenn ich es zu UITableViewStylePlain mache, wird der Header in der Mitte des Bildschirms fixiert. Ich möchte den Header nach unten scrollen, aber wenn ich nach oben scrolle, möchte ich, dass er in der ersten Zeile repariert wird. Kann es möglich sein?
Gorib Developer

2

Ändern Sie Ihren TableView-Stil:

self.tableview = [[UITableView-Zuweisung] initwithFrame: Frame-Stil: UITableViewStyleGrouped];

Gemäß Apple-Dokumentation für UITableView:

UITableViewStylePlain- Eine einfache Tabellenansicht. Alle Kopf- oder Fußzeilen von Abschnitten werden als Inline-Trennzeichen angezeigt und schweben, wenn die Tabellenansicht gescrollt wird.

UITableViewStyleGrouped- Eine Tabellenansicht, deren Abschnitte unterschiedliche Gruppen von Zeilen darstellen. Die Kopf- und Fußzeilen des Abschnitts schweben nicht.

Hoffe, diese kleine Änderung wird Ihnen helfen ..


2
Dies scheint genau das Gegenteil von dem zu sein, was die Frage verlangte - es sollte Plainnicht seinGrouped
CupawnTae

1

Swift 3.0

Erstellen Sie einen ViewController mit den Protokollen UITableViewDelegate und UITableViewDataSource . Erstellen Sie dann eine Tabellenansicht darin und deklarieren Sie ihren Stil als UITableViewStyle.grouped . Dadurch werden die Header korrigiert.

lazy var tableView: UITableView = {
    let view = UITableView(frame: UIScreen.main.bounds, style: UITableViewStyle.grouped)
    view.delegate = self
    view.dataSource = self
    view.separatorStyle = .none
    return view
}()

0

Sie können auch die Eigenschaft bounces der Tabellenansicht auf NO setzen. Dadurch bleiben die Abschnittsüberschriften nicht schwebend / statisch, aber Sie verlieren auch die Bounce-Eigenschaft der Tabellenansicht.


0

um den Header von UITableView-Abschnitten nicht klebrig oder klebrig zu machen:

  1. Ändern Sie den Stil der Tabellenansicht - gruppieren Sie sie für nicht klebrig und machen Sie sie für klebrige Abschnittsüberschriften deutlich - vergessen Sie nicht: Sie können dies vom Storyboard aus tun, ohne Code zu schreiben. (Klicken Sie auf Ihre Tabellenansicht und ändern Sie den Stil im rechten Menü Seite / Komponente.)

  2. Wenn Sie zusätzliche Komponenten wie benutzerdefinierte Ansichten usw. haben, überprüfen Sie bitte die Ränder der Tabellenansicht, um ein geeignetes Design zu erstellen. (wie Höhe der Kopfzeile für Abschnitte und Höhe der Zelle am Indexpfad, Abschnitte)


-1

Jetzt sieht Ihre Tabellenansicht wie ein einfacher Tabellenstil aus, aber schweben Sie nicht, wenn der Tabellenstil auf Gruppe gesetzt ist.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.