UITableView ze stałymi nagłówkami sekcji

107

Witaj, czytam, że domyślnym zachowaniem programu UITableViewjest przypinanie wierszy nagłówków sekcji do góry tabeli podczas przewijania sekcji, aż do momentu, gdy następna sekcja wypchnie wiersz poprzedniej sekcji z widoku.

Mam UITableViewwewnątrz a UIViewControlleri nie wydaje się, żeby tak było.

Czy to tylko nieprawidłowe zachowanie UITableViewController?

Oto uproszczony kod oparty na tym, co mam. Pokażę UIControllerinterfejs i każdą metodę widoku tabeli, którą zaimplementowałem w celu utworzenia widoku tabeli. Mam pomocniczą klasę źródła danych, która pomaga mi indeksować obiekty do użytku z tabelą.

    @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;
}
topwik
źródło
To powinno działać. Pokaż kod.
Matthias Bauch
Jest to całkowicie dobry sposób korzystania z UITableView i powinien działać z nagłówkami. Czego nie robią nagłówki w twoim przypadku?
Eric,
@Eric nagłówki przewijają się wraz z wierszami. Podczas przewijania nie zatrzymują się na górze stołu. Dodałem kod, którego używam do generowania widoku tabeli. Jest to UITableView wewnątrz UIViewController.
topwik,

Odpowiedzi:

305

Nagłówki pozostają stałe tylko wtedy, gdy UITableViewStylewłaściwość tabeli jest ustawiona na UITableViewStylePlain. Jeśli masz to ustawione UITableViewStyleGrouped, nagłówki będą przewijały się w górę wraz z komórkami.

bachonk
źródło
3
mój styl widoku tabeli to UITableViewStylePlain, ale przewija się w górę z komórkami.
yudun1989
8
Jest na to kilka możliwych wyjaśnień. Ważną uwagą jest to, że nagłówki pozostaną ustalone tylko dla komórek w swojej sekcji. Tak więc, jeśli masz nagłówek w sekcji 0, nie pozostanie on ustalony dla komórek w sekcji 1. Innym możliwym wyjaśnieniem jest to, że nie inicjalizujesz swojego UITableView z odpowiednim stylem. Zalecane jest użycie initWithStyle:UITableViewStylePlain, ponieważ wywołanie czegoś takiego jak tableView.style = UITableViewStylePlain nie będzie działać.
bachonk
UITableViewStyleGrouped sprawia, że ​​nagłówek / stopka są ustalane z innymi komórkami, podczas gdy UITableViewStylePlain sprawia, że ​​nagłówek / stopka „pływa”, gdy nagłówek / stopka osiągają górę / dół widoku tabeli.
StoneLam
@bachonk Używam rozciągliwego widoku nagłówka. a mój styl to UITableViewStyleGrouped. Chcę naprawić nagłówek podczas przewijania w górę. jeśli zrobię to UITableViewStylePlain, wtedy nagłówek jest naprawiany na środku ekranu, chcę przewinąć nagłówek w dół, ale podczas przewijania w górę chcę, aby to naprawić w pierwszym wierszu .. czy to możliwe?
Gorib Developer
3

Zmień styl TableView:

self.tableview = [[UITableView assign] initwithFrame: styl ramki: UITableViewStyleGrouped];

Zgodnie z dokumentacją Apple dla UITableView:

UITableViewStylePlain - zwykły widok tabeli. Wszelkie nagłówki lub stopki sekcji są wyświetlane jako separatory w wierszu i przesuwają się podczas przewijania widoku tabeli.

UITableViewStyleGrouped - widok tabeli, którego sekcje przedstawiają różne grupy wierszy. Nagłówki i stopki sekcji nie są ruchome.

Mam nadzieję, że ta mała zmiana Ci pomoże ...

Aks
źródło
2
wydaje się, że jest to dokładnie odwrotność tego, o co pytano - powinno być Plain, a nieGrouped
CupawnTae
1

Swift 3.0

Utwórz ViewController za pomocą protokołów UITableViewDelegate i UITableViewDataSource . Następnie utwórz w nim tableView, deklarując jego styl jako UITableViewStyle.grouped . To naprawi nagłówki.

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
}()
Nursultan Askarbekuly
źródło
0

Możesz również ustawić właściwość odrzuceń widoku tabeli na NIE. Dzięki temu nagłówki sekcji pozostaną niepływające / statyczne, ale utracisz również właściwość odbijania widoku tabeli.

kevinl
źródło
0

aby nagłówek sekcji UITableView nie był lepki ani lepki:

  1. zmień styl widoku tabeli - zgrupuj go, aby nie był lepki i spraw, aby był prosty w przypadku lepkich nagłówków sekcji - nie zapomnij: możesz to zrobić z storyboardu bez pisania kodu. (kliknij widok tabeli i zmień styl z menu po prawej stronie / komponentu)

  2. jeśli masz dodatkowe komponenty, takie jak niestandardowe widoki itp., sprawdź marginesy widoku tabeli, aby utworzyć odpowiedni projekt. (takie jak wysokość nagłówka sekcji i wysokość komórki w ścieżce indeksu, sekcje)

Burcu Kutluay
źródło
-2

Teraz widok tabeli wygląda jak zwykły styl tabeli, ale nie przesuwa się, ustawiając styl tabeli na grupę.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Ravi Kumar
źródło