如何创建具有两个表视图的视图,每个表视图在每一行上重用一个pickerview

Posted

技术标签:

【中文标题】如何创建具有两个表视图的视图,每个表视图在每一行上重用一个pickerview【英文标题】:How to create a view with two tableviews, each reusing a pickerview on every row 【发布时间】:2018-04-23 21:38:43 【问题描述】:

我正在快速开发一个应用程序,其中一个页面中有两个表格视图。每个表视图都可以有用户需要的行数。

假设 A 表是关于猫的,而 B 表是关于狗的。表A中每一行的第一列是一个带有猫类型的pickerview,表B中每一行的第一列是一个带有狗类型的pickerview,当用户从pickerview中选择时,其余的单元格被填充在那一排。

我的问题是,我不知道如何让每个选择器视图与它所在的表中的行唯一对应。我可以在定义表行时定义选择器,但是我不知道如何区分在两个表之间或定义 pickerview 功能。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if tableView == dogTable 
      let dogPicker = UIPickerView()
      dogPicker.dataSource = self
      dogPicker.delegate = self
      dogPicker.showsSelectionIndicator = true
      dogPicker.tag = indexPath.row
      cell.dogType.inputView = dogPicker
     else if tableView == catTable 
      let catPicker = UIPickerView()
      catPicker.dataSource = self
      catPicker.delegate = self
      catPicker.showsSelectionIndicator = true
      catPicker.tag = indexPath.row
      cell.catType.inputView = catPicker
    


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
   //not sure now how to tell if I'm dealing with Dogs or Cats.


我可以在任何函数的范围之外定义一个 catpickerview 和一个 dogpickerview,从而区分这两个表,但是我不能将标签设置为每行特定的。

lazy var dogPicker : UIPickerView  =  [unowned self] in
    let picker = UIPickerView()
    picker.delegate = self
    picker.dataSource = self
    return picker
()

lazy var catPicker : UIPickerView  =  [unowned self] in
    let picker = UIPickerView()
    picker.delegate = self
    picker.dataSource = self
    return picker
()

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    if tableView == dogTable 
      dogPicker.tag = indexPath.row 
      // all pickerviews in this table will end up with tag equal to index of final row
      cell.dogType.inputView = dogPicker
     else if tableView == "catTable" 
      cell.catType.inputView = catPicker
    


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
    switch pickerView 
        case dogPicker:return Dogs[row].Name
        case catPicker:return Cats[row].Name
        default:return ""
    

所以,这两种方法都不起作用。

我怎样才能完成我需要完成的事情?我希望我已经提供了足够的说明,如果需要我可以添加更多。

已编辑:根据@Sh_Khan 的评论,将表比较更改为名称,而不是字符串。

【问题讨论】:

【参考方案1】:

我认为这里的问题是我们绕过了 didSelectRowAtIndexPath,所以表格视图永远不会知道它已被选中。

你可以使用 didSelectRowAtIndexPath 来触发选择器吗?通过这种方式,您可以可靠地知道选择了哪个 tableview 和哪个单元格(行)。并且在选择器的选择事件中,您可以更新基础数据并通过重新加载来更新表格视图。

(现在这取决于您的牢房中还发生了什么。)

或者,您可以将一些附加信息注入到单元格的文本字段标记中,您可以在 UITextFieldDelegate 中使用这些信息。

【讨论】:

太棒了!我最终不得不将 cell.dogType 的 isUserInteractionEnabled 设置为 false,然后在 didSelectRowAt 函数中启用它,并在每次点击时将标签设置为 indexPath.row。效果很好。谢谢!!

以上是关于如何创建具有两个表视图的视图,每个表视图在每一行上重用一个pickerview的主要内容,如果未能解决你的问题,请参考以下文章

视图生成时的 Oracle 值缓存?

IOS 在多个表行中使用相同的视图/引用

从具有不同列名的两个表创建视图

如何使用两个表中的数据创建视图

如何使用来自另一个视图控制器swift的用户输入创建具有表视图单元格的列表

如何删除分组表视图中标题和第一行之间的分隔符