如何在 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) {
}
但我不知道如何实现。有人有想法吗?提前谢谢你。
UIPickerView
是 UIView
的子类,因此您可以像任何其他 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
我有一个包含 7 个单元格的 tableView,如下所示:
我想在你 select 一个单元格时触发一些事件。例如,当您点击用户名行时开始编辑用户名。当您点击性别行时,会在底部弹出一个选择器视图,其中包含 Male/Female selection。 据我所知,我需要将这些事件放入其中:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
}
但我不知道如何实现。有人有想法吗?提前谢谢你。
UIPickerView
是 UIView
的子类,因此您可以像任何其他 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