Ios 试图将内联UIDatePicker添加到UITableViewCell

Ios 试图将内联UIDatePicker添加到UITableViewCell,ios,objective-c,uitableview,uidatepicker,Ios,Objective C,Uitableview,Uidatepicker,我正在尝试在TableView单元格内创建一个内联日期选择器,类似于和SO线程 我使用以下方法创建日期选择器,该方法在加载视图时调用: - (void)createDatePicker{ _datePicker = [[UIDatePicker alloc]init]; _datePicker.datePickerMode = UIDatePickerModeTime; _datePicker.clipsToBounds = YES; _datePicker.ba

我正在尝试在TableView单元格内创建一个内联日期选择器,类似于和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");
}
- (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;
}
…并隐藏单元格:

- (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;
        }
    }
最后,下面的方法是用来确定日期选择器单元格高度的方法:

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

但是,当选择第三节的最后一行时,日期选择器将显示在第一节的第一行中。有人对我做错了什么有什么建议吗

您正在将日期选择器添加到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;
}

)

嗨,杰弗里,这几乎正是我需要的,谢谢!我试过你的建议,但仍然有困难。有可能在聊天中讨论更多吗?非常感谢。事实上,我相信我遇到的bug与我文件中其他地方的代码有关,所以我将把你的答案标记为正确,因为它至少解决了这个特殊的错误。