我正在尝试在表格视图单元格中实现内联UIPicker,类似于this和this 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;
}];
}
答案 0 :(得分:0)
在showPicker功能中,您似乎什么都不做?你创建一个单元格,用它做事情然后它在该函数结束时死亡。从我能看到的地方来看,这个单元格没有被添加到任何地方?
您需要在cellForRowAtIndexPath中添加选择器,以获取您需要选择器的索引路径。
我所做的只需要很少的编码。我在界面构建器中创建了一个包含选取器视图的原型单元。在我的情况下,我还在选择器上方添加了一个工具栏,我可以将按钮放入以允许取消和完成。添加合适的属性以传递最初显示的选择器的当前值。添加一个委托以用于通知创建者(您的tableView)选择器值的更改。您可以等待它完成拾取,或者使用它来更新单元格的编辑值,方法是每次值更改时重新加载正在编辑的单元格。我更喜欢选择器可以选择一个值,你可以提交它或取消它。
当需要编辑单元格时,我会更新我的数据模型以插入编辑条目,然后调用[tableView reload]
。在我的情况下,选择一个单元格开始编辑,单击取消/完成结束编辑。
此时的表格视图将开始询问单元格。这一次将是你的新选择器单元,它将用于编辑它下面的单元格。在创建它时,您将向其传递要编辑的数据的数据模型参考。
所以你可以通过简单地添加一个新的原型单元格类型并在需要时在cellForRowAtIndexPath
内创建它来实现这一切。
您可以选择如何删除选择器。在我的情况下,我有取消/完成按钮,它只是从数据模型中删除条目并重新加载表,导致它永远不会被创建。您还可以将模式设置为单击要添加的单元格,然后再次单击以删除。您只需更新数据模型并重新加载即可。了解时间选择器如何在Calander应用程序上进行新约会。
你可能会认为这是很多重装。然而,它只影响屏幕上的内容,我发现它比试图一直找出受影响的细胞更容易。它也很顺畅。当它工作时,你总是可以优化代码。
在单元格中使用约束以确保它具有所需的布局。