UITableView với tiêu đề phần cố định


106

Greets, tôi đang đọc rằng hành vi mặc định của UITableViewlà ghim các hàng tiêu đề phần lên đầu bảng khi bạn cuộn qua các phần cho đến khi phần tiếp theo đẩy hàng phần previos ra khỏi chế độ xem.

Tôi có một UITableViewbên trong UIViewControllervà điều này dường như không phải như vậy.

Đó có phải chỉ là hành vi defualt cho UITableViewController?

Đây là một số mã đơn giản dựa trên những gì tôi có. Tôi sẽ hiển thị UIControllergiao diện và từng phương pháp xem bảng mà tôi đã triển khai để tạo chế độ xem bảng. Tôi có một lớp nguồn dữ liệu trợ giúp giúp tôi lập chỉ mục các đối tượng của mình để sử dụng với bảng.

    @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;
}

Cần làm việc. Hiển thị một số mã.
Matthias Bauch

Đó là một cách hoàn toàn tốt để sử dụng UITableView và sẽ hoạt động với các tiêu đề. Tiêu đề không làm gì trong trường hợp của bạn?
Eric

@Eric các tiêu đề đang cuộn theo các hàng. Chúng không dừng lại ở đầu bảng khi tôi cuộn. Tôi đã thêm mã mà tôi đang sử dụng để tạo chế độ xem bảng của mình. Đó là một UITableView bên trong UIViewController.
topwik

Câu trả lời:


304

Các tiêu đề chỉ được giữ cố định khi thuộc UITableViewStyletính của bảng được đặt thành UITableViewStylePlain. Nếu bạn đã đặt thành này UITableViewStyleGrouped, tiêu đề sẽ cuộn lên cùng với các ô.


3
kiểu xem bảng của tôi là UITableViewStylePlain, nhưng nó cũng cuộn lên với các ô.
yudun1989

8
Có một vài cách giải thích cho điều này. Một lưu ý quan trọng là các tiêu đề sẽ chỉ được giữ cố định cho các ô trong phần của nó. Vì vậy, nếu bạn có tiêu đề trong phần 0, nó sẽ không được cố định cho các ô trong phần 1. Một giải thích khác có thể xảy ra là bạn không khởi tạo UITableView của mình với kiểu thích hợp. Bạn nên sử dụng initWithStyle:UITableViewStylePlain, vì việc gọi một cái gì đó như tableView.style = UITableViewStylePlain sẽ không hoạt động.
bachonk

UITableViewStyleGrouped làm cho đầu trang / chân trang cố định với các ô khác, trong khi UITableViewStylePlain làm cho đầu trang / chân trang "nổi" khi đầu trang / chân trang đạt đến đầu / cuối của chế độ xem bảng.
StoneLam

@bachonk, tôi đang sử dụng chế độ xem tiêu đề có thể co giãn. và phong cách của tôi là UITableViewStyleGrouped. tôi muốn sửa tiêu đề khi cuộn lên. nếu tôi đặt nó là UITableViewStylePlain thì tiêu đề đang cố định ở giữa màn hình, tôi muốn cuộn tiêu đề xuống, nhưng khi cuộn lên tôi muốn nó sửa ở hàng đầu tiên .. có được không?
Gorib Developer

2

Thay đổi kiểu TableView của bạn:

self.tableview = [[UITableView Distribution] initwithFrame: frame style: UITableViewStyleGrouped];

Theo tài liệu apple cho UITableView:

UITableViewStylePlain- Chế độ xem bảng đơn giản. Bất kỳ đầu trang hoặc chân trang nào của phần đều được hiển thị dưới dạng dấu phân cách nội dòng và nổi khi chế độ xem bảng được cuộn.

UITableViewStyleGrouped- Chế độ xem bảng có các phần hiển thị các nhóm hàng riêng biệt. Phần đầu trang và chân trang không nổi.

Hy vọng thay đổi nhỏ này sẽ giúp ích cho bạn ..


2
điều này dường như hoàn toàn ngược lại những gì mà câu hỏi yêu cầu - nó phải được Plain, khôngGrouped
CupawnTae

1

Swift 3.0

Tạo một ViewController với UITableViewDelegateUITableViewDataSource giao thức. Sau đó, tạo một tableView bên trong nó, khai báo kiểu của nó là UITableViewStyle.grouped . Điều này sẽ sửa chữa các tiêu đề.

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

Bạn cũng có thể đặt thuộc tính số trang không truy cập của tableview thành KHÔNG. Điều này sẽ giữ cho các tiêu đề phần không nổi / tĩnh, nhưng sau đó bạn cũng mất thuộc tính thoát của chế độ xem bảng.


0

để làm cho tiêu đề các phần UITableView không dính hoặc dính:

  1. thay đổi kiểu của chế độ xem bảng - làm cho nó được nhóm lại để không dính và làm cho nó đơn giản đối với các tiêu đề phần dính - đừng quên: bạn có thể làm điều đó từ bảng phân cảnh mà không cần viết mã. (nhấp vào chế độ xem bảng của bạn và thay đổi nó thành kiểu từ menu Bên phải / thành phần)

  2. nếu bạn có các thành phần phụ như dạng xem tùy chỉnh hoặc v.v ... vui lòng kiểm tra lề của dạng xem bảng để tạo thiết kế thích hợp. (chẳng hạn như chiều cao của tiêu đề cho các phần và chiều cao của ô tại đường dẫn chỉ mục, các phần)


-2

Bây giờ chế độ xem bảng của bạn trông giống như kiểu bảng đơn giản nhưng không thả nổi kiểu bảng cài đặt buz được đặt thành nhóm.

[_tableView setBackgroundView:nil];
_tableView.backgroundColor = [UIColor whiteColor];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.