Ok, saya tahu ini sudah terlambat tetapi saya harus melakukannya. Saya telah menghabiskan 10 jam dengan sekarang mencari solusi yang berfungsi tetapi tidak menemukan jawaban yang lengkap. Memang menemukan beberapa petunjuk tetapi sulit bagi pemula untuk memahaminya. Jadi saya harus memasukkan 2 sen dan menyelesaikan jawabannya.
Seperti yang telah disarankan dalam beberapa jawaban, satu-satunya solusi yang dapat saya terapkan adalah dengan memasukkan sel normal dalam tampilan tabel dan menanganinya sebagai Header Bagian, tetapi cara yang lebih baik untuk mencapainya adalah dengan memasukkan sel-sel ini di baris 0 dari setiap bagian. Dengan cara ini kita dapat menangani tajuk non-apung khusus ini dengan sangat mudah.
Jadi, langkah-langkahnya adalah.
Terapkan UITableView dengan gaya 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;
}
Terapkan titleForHeaderInSection seperti biasa (Anda bisa mendapatkan nilai ini dengan menggunakan logika Anda sendiri, tetapi saya lebih suka menggunakan delegasi standar).
- (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *headerTitle = [sectionArray objectAtIndex:section];
return headerTitle;
}
Nomor ImmobementOfSectionsInTableView seperti biasa
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
int sectionCount = [sectionArray count];
return sectionCount;
}
Terapkan numberOfRowsInSection seperti biasa.
- (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
}
Kembalikan 0.0f tingginyaForHeaderInSection.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.0f;
}
JANGAN mengimplementasikan viewForHeaderInSection. Hapus metode sepenuhnya daripada mengembalikan nol.
Di ketinggianForRowAtIndexPath. Periksa apakah (indexpath.row == 0) dan kembalikan tinggi sel yang diinginkan untuk tajuk bagian, jika tidak kembalikan tinggi sel.
- (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
}
}
Sekarang di cellForRowAtIndexPath, periksa apakah (indexpath.row == 0) dan implementasikan sel seperti yang Anda inginkan menjadi header bagian dan atur gaya pemilihan ke none. ELSE mengimplementasikan sel seperti yang Anda inginkan sel normal.
- (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;
}
}
Sekarang implementasikan willSelectRowAtIndexPath dan kembalikan nil jika indexpath.row == 0. Ini akan peduli bahwa didSelectRowAtIndexPath tidak pernah dipecat untuk baris header Bagian.
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
return nil;
}
return indexPath;
}
Dan akhirnya di didSelectRowAtIndexPath, periksa apakah (indexpath.row! = 0) dan lanjutkan.
- (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
}
}
Dengan ini Anda selesai. Sekarang Anda memiliki tajuk bagian yang bebas menggulir dan tidak mengambang.