Ok, tôi biết là muộn nhưng tôi phải làm điều đó. Tôi đã dành 10 giờ để tìm kiếm một giải pháp làm việc nhưng không tìm thấy câu trả lời hoàn chỉnh. Đã tìm thấy một số gợi ý nhưng khó khăn cho người mới bắt đầu để hiểu. Vì vậy, tôi đã phải đặt 2 xu của mình và hoàn thành câu trả lời.
Như đã được đề xuất trong một vài câu trả lời, giải pháp làm việc duy nhất mà tôi có thể thực hiện là bằng cách chèn các ô bình thường vào chế độ xem bảng và xử lý chúng dưới dạng Tiêu đề Mục, nhưng cách tốt hơn để đạt được là bằng cách chèn các ô này vào hàng 0 của mỗi phần. Bằng cách này, chúng ta có thể xử lý các tiêu đề không nổi tùy chỉnh này rất dễ dàng.
Vì vậy, các bước là.
Triển khai UITableView với kiểu UITableViewStylePlain.
-(void) loadView
{
[super loadView];
UITableView *tblView =[[UITableView alloc] initWithFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height-44-61-frame.origin.y) style:UITableViewStylePlain];
tblView.delegate=self;
tblView.dataSource=self;
tblView.tag=2;
tblView.backgroundColor=[UIColor clearColor];
tblView.separatorStyle = UITableViewCellSeparatorStyleNone;
}
Triển khai titleForHeaderInSection như bình thường (bạn có thể nhận được giá trị này bằng cách sử dụng logic của riêng bạn, nhưng tôi thích sử dụng các đại biểu tiêu chuẩn).
- (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *headerTitle = [sectionArray objectAtIndex:section];
return headerTitle;
}
Thực hiện sốOfSectionsInTableView như bình thường
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
int sectionCount = [sectionArray count];
return sectionCount;
}
Triển khai numberOfRowsInSection như bình thường.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
int rowCount = [[cellArray objectAtIndex:section] count];
return rowCount +1; //+1 for the extra row which we will fake for the Section Header
}
Trả về 0,0f trong heightForHeaderInSection.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.0f;
}
KHÔNG thực hiện viewForHeaderInSection. Loại bỏ hoàn toàn phương pháp thay vì trả về con số không.
Trong heightForRowAtIndexPath. Kiểm tra xem (indexpath.row == 0) và trả về chiều cao ô mong muốn cho tiêu đề của phần, phần khác trả về chiều cao của ô.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row == 0)
{
return 80; //Height for the section header
}
else
{
return 70; //Height for the normal cell
}
}
Bây giờ trong cellForRowAtIndexPath, hãy kiểm tra xem (indexpath.row == 0) và triển khai ô như bạn muốn tiêu đề phần là và đặt kiểu chọn thành không. ELSE triển khai ô như bạn muốn ô bình thường.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SectionCell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"SectionCell"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone; //So that the section header does not appear selected
cell.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SectionHeaderBackground"]];
}
cell.textLabel.text = [tableView.dataSource tableView:tableView titleForHeaderInSection:indexPath.section];
return cell;
}
else
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleGray; //So that the normal cell looks selected
cell.backgroundView =[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"CellBackground"]]autorelease];
cell.selectedBackgroundView=[[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"SelectedCellBackground"]] autorelease];
}
cell.textLabel.text = [[cellArray objectAtIndex:indexPath.section] objectAtIndex:indexPath.row -1]; //row -1 to compensate for the extra header row
return cell;
}
}
Bây giờ triển khai willSelectRowAtIndexPath và trả về nil nếu indexpath.row == 0. Điều này sẽ quan tâm rằng didSelectRowAtIndexPath không bao giờ bị sa thải cho hàng tiêu đề Mục.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
return nil;
}
return indexPath;
}
Và cuối cùng trong didSelectRowAtIndexPath, kiểm tra xem (indexpath.row! = 0) và tiếp tục.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row != 0)
{
int row = indexPath.row -1; //Now use 'row' in place of indexPath.row
//Do what ever you want the selection to perform
}
}
Với điều này bạn đã hoàn thành. Bây giờ bạn có một tiêu đề phần không cuộn hoàn toàn cuộn.