尝试将内联UIDatePicker添加到UITableViewCell

我正在尝试在TableView单元格中创建一个内联DatePicker,类似于这个和这个 SO线程。

我使用下面的方法创建日期选择器,在加载视图时调用它:

- (void)createDatePicker{ _datePicker = [[UIDatePicker alloc]init]; _datePicker.datePickerMode = UIDatePickerModeTime; _datePicker.clipsToBounds = YES; _datePicker.backgroundColor = [UIColor colorWithRed:0.922 green:0.937 blue:0.949 alpha:1]; NSLog(@"date picker created"); } 

然后我检查我的表视图中第三部分的底行是否被选中。 如果是,并且日期选择器已经没有显示,那么我调用该方法来显示日期选择器的单元格:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.row == HourTimeZoneRow && self.datePickerIsShowing == NO) { NSLog(@"Time of day section"); [self showDatePickerCell]; } else { [self hideDatePickerCell]; } [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } 

以下是显示日期选择器单元格的方法:

 - (void)showDatePickerCell { [self.tableView addSubview:_datePicker]; self.datePickerIsShowing = YES; self.datePicker.hidden = NO; [self.tableView reloadData]; NSLog(@"Show date picker"); } 

…并隐藏单元格:

 - (void)hideDatePickerCell { self.datePickerIsShowing = NO; self.datePicker.hidden = YES; [self.tableView reloadData]; NSLog(@"Hide date picker"); } 

下面是确定表视图是否需要添加额外单元格以显示UIDatePicker的方法。

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { switch (section) { case TableSectionOne: return TotalRowsSection1; break; case TableSectionTwo: return TotalRedZoneRows; break; case TableSectionThree: if (self.datePickerIsShowing == YES) { return TableSectionThree + 1; } else { return TableSectionThree; } break; default: return 0; break; } } 

最后,下面的方法是确定日期选择器单元格的高度:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { CGFloat rowHeight = self.tableView.rowHeight; if (indexPath.row == HourTimeZoneRow){ rowHeight = 164; } else { rowHeight = self.tableView.rowHeight; } return rowHeight; } 

但是,发生的情况是,当选择第三部分的最后一行时,日期选择器将显示在第一部分的第一行中。 有没有人对我做错了什么有任何建议?

您将datePicker添加到tableView,而不是tableView中的单元格。

从showDatePickerCell中删除此行:

 [self.tableView addSubview:_datePicker]; 

然后在cellForItemAtIndexPath中的正确单元格中添加(或取消隐藏)。

(就像是:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *simpleTableIdentifier = @"SimpleTableItem"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier]; } if (indexPath.row == HourTimeZoneRow) { // show the datePicker here } cell.textLabel.text = [tableData objectAtIndex:indexPath.row]; return cell; }