iOS7 - 在UITableViewCell中嵌入UIPickerView和UIDatePicker

6

number篇文章涉及主题:如何制作inline UIPickerView。由于我很懒,有没有人能指点一下代码片段。老实说,我觉得苹果的DateCell示例过于学究 - 一定有更优雅的方法。

日期单元格应用程序是一个好的起点吗?还是有其他更好的链接。我会感激任何建议。

如果您阅读此内容并不理解我的要求/目标,请参阅上述两篇文章或直接下载Apple Sample(需要开发者帐户)。


嗨,David,我目前正在为同样的问题苦苦挣扎。 有没有可能(既然你解决了这个问题),你有任何示例代码,我能够参考一下? 谢谢! - narner
1
嗨,纳纳,让我恢复一下记忆,然后再回复你。 - ICL1901
那太棒了,David,我会非常感激! - narner
我最终采用了一个可扩展/收缩的TableView单元格结构,并集成了Tom Fewster的控件:https://github.com/wannabegeek。该控件包括一个内联日期选择器。希望这可以帮到你。 - ICL1901
谢谢David,我尝试从那个链接运行项目,但不幸的是缺少一个文件。我尝试了一下,但遇到了一个问题(在这个SO问题中:http://stackoverflow.com/questions/28353639/attempting-to-add-an-inline-uidatepicker-to-a-uitableviewcell)。你介意看一下吗? - narner
你在那里有一个新的答案,看起来很合理。还有这个线程:https://dev59.com/RWMk5IYBdhLWcg3wywwU?lq=1 - ICL1901
1个回答

9
我使用另一种 - 可能更简单的 - 解决方案来解决这个问题。
想象我们有两个单元格:
1. 日期标签单元格 2. 日期选择器单元格
大部分的“魔法”都在表视图委托的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];
    }
}

调用空的 beginUpdatesendUpdates 块会强制表格再次调用 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,否则会出现一些视图故障。


谢谢Florian。我会尝试在日期单元格中使用它。你是否为UIPickerView单元格实现了类似的功能? - ICL1901
Florian,请问您能展示一下这两个方法吗:isDatePickerRowAtIndexPath:indexPath和isDatePickerShown(非常感谢) - ICL1901
截至iOS 11,这仍然是一个很好的解决方案,谢谢! - user1195883

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接