内联UIPicker实现

时间:2015-02-12 18:48:50

标签: ios objective-c uitableview uipickerview tableviewcell

我正在尝试在表格视图单元格中实现内联UIPicker,类似于thisthis SO问题。我相信我的实现很接近,但是目前,当我选择合适的单元格时,没有显示选择器。关于我做错了什么,有人能指出我正确的方向吗?谢谢!

下面是我确定每个部分中出现哪些行的地方:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    switch (indexPath.section) {
        case NotificationsSection:
            return [self tableView:tableView cellForAreaOneRowAtIndexPath:indexPath];
            break;
        case RedZoneSection:
            return [self tableView:tableView cellForAreaTwoRowAtIndexPath:indexPath];
            break;
        case TimeOfDaySection:
            return [self tableView:tableView cellForAreaThreeRowAtIndexPath:indexPath];
            break;
        default:
            return nil;
            break;
    }
}

下面是我检查每个部分的行数的地方。我怀疑我的问题可能在这里,但我不完全确定。

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    switch (section) {
        case AreaOneSection:
            return AreaOneRows;
            break;
        case AreaTwoSection:
            return TotalAreaTwoRows;
            break;
        case AreaThreeSection:
            return TotalAreaThreeRows;
            break;
        default:
            return 0;
            break;
    }
}

下面是我返回每行高度的地方:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    CGFloat rowHeight = self.tableView.rowHeight;
    //    if (indexPath.section == TimeOfDaySection && indexPath.row == HourTimeZoneRow  && self.timePickerIsShowing == NO){
    return rowHeight;
}

最后,我在下面检查用户是否选择了我想在下面插入UIPicker单元格的索引路径。如果他们这样做,那么我调用一种方法来显示选择器。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];

    if (indexPath.section == SectionThree && indexPath.row == RowOne  && self.timePickerIsShowing == NO){

        [tableView beginUpdates];
        [self showTimePicker];
        [tableView endUpdates];
    } else{
        [self hideTimePicker];
        [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
}

最后,下面是我展示和隐藏UIPicker的地方。

- (void)showTimePicker
{
    self.timePickerIsShowing = YES;
    self.timePicker.hidden = NO;
    //build the index path to where the picker should be inserted here
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:HourTimeZoneRow + 1 inSection:TimeOfDaySection];

    static NSString *CellIdentifier = @"TimePickerCell";
    UITableViewCell *cell = (UITableViewCell*)[self.tableView  dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    _timePicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.bounds.size.width, 160)];
    [cell.contentView addSubview:self.timePicker];

    [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView reloadData];
    self.timePicker.alpha = 0.0f;
    [UIView animateWithDuration:0.25 animations:^{
        self.timePicker.alpha = 1.0f;
    }];
}

- (void)hideTimePicker {
    self.timePickerIsShowing = NO;
    self.timePicker.hidden = YES;
    [self.tableView reloadData];
    [UIView animateWithDuration:0.25
                     animations:^{
                         self.timePicker.alpha = 0.0f;
                     }
                     completion:^(BOOL finished){
                         self.timePicker.hidden = YES;
                     }];
}

1 个答案:

答案 0 :(得分:0)

在showPicker功能中,您似乎什么都不做?你创建一个单元格,用它做事情然后它在该函数结束时死亡。从我能看到的地方来看,这个单元格没有被添加到任何地方?

您需要在cellForRowAtIndexPath中添加选择器,以获取您需要选择器的索引路径。

我所做的只需要很少的编码。我在界面构建器中创建了一个包含选取器视图的原型单元。在我的情况下,我还在选择器上方添加了一个工具栏,我可以将按钮放入以允许取消和完成。添加合适的属性以传递最初显示的选择器的当前值。添加一个委托以用于通知创建者(您的tableView)选择器值的更改。您可以等待它完成拾取,或者使用它来更新单元格的编辑值,方法是每次值更改时重新加载正在编辑的单元格。我更喜欢选择器可以选择一个值,你可以提交它或取消它。

当需要编辑单元格时,我会更新我的数据模型以插入编辑条目,然后调用[tableView reload]。在我的情况下,选择一个单元格开始编辑,单击取消/完成结束编辑。

此时的表格视图将开始询问单元格。这一次将是你的新选择器单元,它将用于编辑它下面的单元格。在创建它时,您将向其传递要编辑的数据的数据模型参考。

所以你可以通过简单地添加一个新的原型单元格类型并在需要时在cellForRowAtIndexPath内创建它来实现这一切。

您可以选择如何删除选择器。在我的情况下,我有取消/完成按钮,它只是从数据模型中删除条目并重新加载表,导致它永远不会被创建。您还可以将模式设置为单击要添加的单元格,然后再次单击以删除。您只需更新数据模型并重新加载即可。了解时间选择器如何在Calander应用程序上进行新约会。

你可能会认为这是很多重装。然而,它只影响屏幕上的内容,我发现它比试图一直找出受影响的细胞更容易。它也很顺畅。当它工作时,你总是可以优化代码。

在单元格中使用约束以确保它具有所需的布局。