如何在 select tableView 中的单元格时触发 pickerview

How to trigger a pickerview when select a cell in a tableView

我有一个包含 7 个单元格的 tableView,如下所示:

我想在你 select 一个单元格时触发一些事件。例如,当您点击用户名行时开始编辑用户名。当您点击性别行时,会在底部弹出一个选择器视图,其中包含 Male/Female selection。 据我所知,我需要将这些事件放入其中:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

}

但我不知道如何实现。有人有想法吗?提前谢谢你。

UIPickerViewUIView 的子类,因此您可以像任何其他 UIView 对象一样添加和使用它。对于您的特定要求,您应该创建一个 UIPickerView 的对象并在必要时显示和隐藏它。 因此,创建一个 UIPickerView 并在 table 视图上方添加您添加 tableView 的视图,并在 didSelectRowAtIndexPath 中设置 pickerView.hidden = false

你也可以通过

从底部开始动画
UIView.animateWithDuration(1, animations: { () -> Void in
            // And set final frame here
        })

你是对的。将逻辑放在 didSelectRowAtIndexPath 中是一个很好的方法。

你怎么做就是写代码。没有现成的答案。

如果您希望内容显示在当前 window 之上,那么您需要自己处理。在 iPad 上,您可以使用弹出框,但 iPhone/iPod 触摸屏本身不支持弹出框。您可能会考虑使用为 iPhone 提供弹出窗口支持的第 3 方弹出窗口库。在 Github 上有几个,可能在 Cocoa 控件上也有几个。我以前用过一个,但它有一些问题,所以我不推荐它。

如果您可以展示一个全新的视图控制器,那么只需在故事板中定义一个新的视图控制器,给它一个唯一的标识符,使用 instantiateViewControllerWithIdentifier 创建它,然后 presentViewController:animated: 显示它模态。

基本上,您可以让每个单元格都有自己的选择器视图。

open class DatePickerTableViewCell: UITableViewCell {

  let picker = UIDatePicker()

  open override func awakeFromNib() {
    super.awakeFromNib()
    picker.datePickerMode = UIDatePickerMode.date
  }

  open override var canBecomeFirstResponder: Bool {
    return true
  }

  open override var canResignFirstResponder: Bool {
    return true
  }

  open override var inputView: UIView? {
    return picker
  }
  ...
}

然后在您的 didSelectRowAt 中,将单元格设为 becomeFirstResponder:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
 if let cell = tableView.cellForRow(at: indexPath) as? DatePickerTableViewCell {
  if !cell.isFirstResponder {
    _ = cell.becomeFirstResponder()
  }
 }
}

你可以查看我的图书馆了解详情: https://github.com/hijamoya/PickerViewCell