Tableview确实在ios中选择了需要选择器视图

时间:2014-10-20 09:19:43

标签: ios iphone

我想在UITableView方法-didSelectRowAtIndexPath上显示选择器视图。这是一个样本设计(我需要自定义选择器,它显示食物名称而不是日期和时间)。 NumberOfRowsInSection大于10.当选择单元格时,将显示选择器视图并从选择器视图中选择值。我怎样才能做到这一点?

enter image description here

3 个答案:

答案 0 :(得分:0)

在TableViewController中实现UIPickerViewDataSource& UIPickerViewDelegate协议使用以下方法:

  • numberOfComponentsInPickerView (选择器视图中的列数,根据您的情况可能为1)。
  • pickerView:numberOfRowsInComponent (要显示的行数,可能是您的数据数组)。
  • pickerView:rowHeightForComponent:(组件中每行的高度,我认为有一个默认值,如果它没有实现,但你可能想要改变它。)
  • pickerView:titleForRow:forComponent:(标题,如果您只想显示每个组件的文本,这与TableViews中的“cellForRowAtIndexPath”方法非常相似)。

如果您想以更个性化的方式呈现数据,而不是“titleForRow”实现:

  • pickerView:viewForRow:forComponent:reusingView:

当用户在选择器工具中选择一行时进行事件处理:

  • pickerView:didSelectRow:inComponent:

重新设置在创建时将UIPickerView的委托设置为'self'(这将在TableView的单元格中,因此您有很多选项可以创建它,或者创建一个原型单元格内置UIPickerView的故事板或在'cellForRowAtIndexPath'中手动操作的故事板,并符合TableViewController的头文件中的那些协议。

要实现从TableView中的常规TableViewCell切换到具有交互式UIPickerView的单元格,您可能希望在TableViewController中使用“didSelectRowAtIndexPath”来刷新该单元格,您可以使用[self.tableView reloadData]或者使用动画使用:

  • reloadRowsAtIndexPaths:withRowAnimation:

例如,您可以将名为“editingPickerView”的BOOL变量初始设置为“NO”,并在“didSelectRowForIndexPath”方法中设置:

if(indexPath.row == X) {
   self.editingPickerView = !self.editingPickerView;
   [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationFade]; 
}

我使用故事板,所以我会有一个原型单元格显示正常数据(没有UIPickerView),当选择显示不同的原型单元格时。 同时,在'cellForRowAtIndexPath'中,你需要有一种不同的方式来提供相同的行,具体取决于'editingPickerView'变量,有点像这样:

if(editingPickerView) {
   //reuse the cell with the identifier 'UIPickerView_cell'
   UIPickerView *picker = (UIPickerView*) [cell viewWithTag:69];
   picker.delegate = self;
} else {
   //reuse the normal cell with the identifier 'normal_cell' and show data
}

如果要在用户在pickerView中选择UIPickerView中的行时更改为普通单元格:didSelectRow:inComponent:您应该执行以下操作:

self.editingPickerView = !self.editingPickerView;
//you should probably know 'a priori' what index path your picker would be in
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation: UITableViewRowAnimationFade];

答案 1 :(得分:0)

在视图中添加隐藏的文本字段。然后在viewDidload中:

self.dtmPicker = [[UIDatePicker alloc] init];
self.dtmPicker.datePickerMode = UIDatePickerModeDate;
[self.dtmPicker addTarget:self action:@selector(DateChanged:) forControlEvents:UIControlEventValueChanged];
self.lblDate.inputView = self.dtmPicker;

我正在使用它。这很容易:)

答案 2 :(得分:0)

这可能会有所帮助。只需将UIDatePicker替换为UIPicker控件&添加适当的委托方法。网址:http://masteringios.com/blog/2013/10/31/ios-7-in-line-uidatepicker/3/

我认为这就是你想要的。只需删除“UIColor + Custom.h”,“UIColor + Custom.m”&它引用了错误。

网址:https://github.com/wannabegeek/PickerTableViewCell