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

How to create a view with two tableviews, each reusing a pickerview on every row

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

说 Table A 是关于猫的,Table B 是关于狗的。 Table A 中每一行的第一列是带有猫类型的 pickerview,Table B 中每一行的第一列是带有狗类型的 pickerview,当用户从 pickerview 中选择时,其余单元格填充在该行中。

我的问题是,我不知道如何让每个选择器视图与它所在的 table 中的行唯一对应。我可以在定义 table 行时定义选择器,但后来我不知道如何区分这两个 table 或定义 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,因此可以区分这两个 table,但是我不能将标签设置为每行特定的。

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 的评论,更改了table 与名称而非字符串的比较。

我认为这里的问题是我们绕过了 didSelectRowAtIndexPath,因此 table 视图永远不知道它已被选中。

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

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

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