ตกลงฉันรู้ว่ามันสาย แต่ฉันต้องทำ ฉันใช้เวลา 10 ชั่วโมงโดยค้นหาวิธีแก้ปัญหาที่ใช้งานได้ แต่ไม่พบคำตอบที่สมบูรณ์ พบคำแนะนำบางอย่าง แต่ยากสำหรับผู้เริ่มต้นที่จะเข้าใจ ดังนั้นฉันต้องใส่ 2 เซ็นต์ของฉันและตอบคำถามให้สมบูรณ์
ตามที่ได้รับการแนะนำในคำตอบไม่กี่คำตอบวิธีแก้ปัญหาการทำงานเดียวที่ฉันสามารถนำไปใช้ได้คือการแทรกเซลล์ปกติในมุมมองตารางและจัดการกับพวกเขาเป็นส่วนหัว แต่วิธีที่ดีกว่าที่จะบรรลุคือการแทรกเซลล์เหล่านี้ที่ แถว 0 ของทุกส่วน วิธีนี้เราสามารถจัดการกับส่วนหัวที่ไม่ได้กำหนดเองเหล่านี้ได้อย่างง่ายดาย
ใช้ UITableView ด้วยสไตล์ 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;
}
ใช้ titleForHeaderInSection ตามปกติ (คุณสามารถรับค่านี้ได้โดยใช้ตรรกะของคุณเอง แต่ฉันต้องการใช้ผู้รับมอบสิทธิ์มาตรฐาน)
- (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
NSString *headerTitle = [sectionArray objectAtIndex:section];
return headerTitle;
}
ไม่ใช้ numberOfSectionsInTableView ตามปกติ
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
int sectionCount = [sectionArray count];
return sectionCount;
}
ใช้ numberOfRowsInSection ตามปกติ
- (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
}
ส่งคืนความสูง 0.0f สำหรับส่วนหัวส่วนต่อท้าย
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.0f;
}
ห้ามใช้ viewForHeaderInSection ลบเมธอดทั้งหมดแทนการคืนค่าศูนย์
ใน heightForRowAtIndexPath ตรวจสอบว่า (indexpath.row == 0) และส่งกลับความสูงของเซลล์ที่ต้องการสำหรับส่วนหัวของส่วนอื่น ๆ กลับความสูงของเซลล์
- (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
}
}
ตอนนี้ใน cellForRowAtIndexPath ตรวจสอบว่า (indexpath.row == 0) และใช้เซลล์ตามที่คุณต้องการให้ส่วนหัวของส่วนนั้นเป็นและตั้งค่าสไตล์การเลือกให้เป็น none ELSE ใช้เซลล์ตามที่คุณต้องการให้เซลล์ปกติเป็น
- (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;
}
}
ตอนนี้ใช้ willSelectRowAtIndexPath และคืนค่าศูนย์ถ้า indexpath.row == 0 สิ่งนี้จะสนใจว่า didSelectRowAtIndexPath จะไม่ถูกเรียกใช้สำหรับแถวส่วนหัว
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (indexPath.row == 0)
{
return nil;
}
return indexPath;
}
และในที่สุดก็ didSelectRowAtIndexPath ตรวจสอบว่า (indexpath.row! = 0) และดำเนินการต่อ
- (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
}
}