【问题标题】:How to trigger a pickerview when select a cell in a tableView在tableView中选择单元格时如何触发pickerview
【发布时间】:2015-08-14 17:06:34
【问题描述】:

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

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

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

}

但我不知道如何做到这一点。有人有想法吗?提前谢谢你。

【问题讨论】:

    标签: ios swift uitableview uipickerview


    【解决方案1】:

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

    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

    【讨论】:

    • 到目前为止这个问题的最佳答案。
    • 谢谢,请随时向我的图书馆提出任何建议。
    【解决方案2】:

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

    你是怎么做的就是写代码。没有股票答案。

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

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

    【讨论】:

      【解决方案3】:

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

      你也可以从底部通过动画它

      UIView.animateWithDuration(1, animations: { () -> Void in
                  // And set final frame here
              })
      

      【讨论】:

      • 通过设置视图的框架来做动画在自动布局中是不可靠的。通常你需要使用一个约束,改变约束上的常量,然后在动画闭包内部调用 layoutIfNeeded。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多