ios7 - UITableViewCell,内置UIPickerView和UIDatePicker

时间:2013-12-13 12:15:16

标签: uitableview ios7 uipickerview

number个帖子正在处理主题:如何制作inline UIPickerView。因为我很懒,所以任何人都可以指向我的代码片段。说实话,我发现Apple DateCell样本很迂腐 - 必须有一个更优雅的方法。

dateCell应用程序是一个很好的起点吗?还是有其他更好的链接。我很感激任何建议。

如果您阅读此内容并且不理解我的要求/目标,请参阅上面引用的两篇帖子,或者只需下载Apple Sample(需要开发帐号)。

1 个答案:

答案 0 :(得分:10)

我使用另一种 - 也许更简单 - 解决这个问题的解决方案。

我们有两个单元格的图像

  1. 日期标签单元格
  2. 日期选择器单元格
  3. 大多数“魔法”都在表格视图委托的tableView:heightForRowAtIndexPath:方法中:

    - (CGFloat)tableView:(UITableView:)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        CGFloat heightForRow = tableView.rowHeight;
    
        if ([self isDatePickerRowAtIndexPath:indexPath]) {
            heightForRow = (self.isDatePickerShown) ? heightOfDatePicker : 0.0;
        }
    
        return heightForRow;
    }
    

    因此,您只需返回0.0的高度即可“隐藏”日期选择器。


    tableView:didSelectRowAtIndexPath:方法中进行切换:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        if ([self isDateLabelRowAtIndexPath:indexPath])
        {
            self.datePickerIsShown = ! self.isDatePickerShown;
            [tableView beginUpdates];
            [tableView endUpdates];
        }
    }
    

    调用空的beginUpdates endUpdates块会强制该表再次调用tableView:heightForRowAtIndexPath:(动画)并很好地淡入或淡出日期选择器单元格。


    当日期选择器单元格是某个部分中的最后一个时,您可能还希望在隐藏日期选择器时将日期标签单元格的separatorInset更新为UIEdgeInsetsZero显示时的默认值。


    修改

    为了完整性:datePickerIsShown是一个简单的布尔值:

    @property(nonatomic, getter = isDatePickerShown) BOOL datePickerIsShown;
    

    方法isDateLabelRowAtIndexPath:isDatePickerRowAtIndexPath:只是将给定indexPath与适当单元格的已知索引路径进行比较的辅助方法:

    - (BOOL)isDatePickerRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return ([self.datePickerIndexPath compare:indexPath] == NSOrderedSame);
    }
    

    编辑2:

    缺少一个额外步骤:确保将日期选择器单元格的clipsToBounds属性设置为YES,否则会出现一些视图故障。