Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何创建具有两个TableView的视图,每个TableView在每行上都重用一个pickerview_Ios_Iphone_Swift_Uitableview_Uipickerview - Fatal编程技术网

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

Ios 如何创建具有两个TableView的视图,每个TableView在每行上都重用一个pickerview,ios,iphone,swift,uitableview,uipickerview,Ios,Iphone,Swift,Uitableview,Uipickerview,我正在用swift开发一个应用程序,其中一个页面有两个TableView。每个表视图可以有用户想要的任意多行 假设A表是关于猫的,B表是关于狗的。表A中每一行的第一列是带有猫类型的pickerview,表B中每一行的第一列是带有狗类型的pickerview,当用户从pickerview中选择时,其余单元格填充在该行中 我的问题是,我不知道如何让每个pickerview与它所在的表中的行唯一对应。我可以在定义表行的同时定义选择器,但我不知道如何区分这两个表或定义pickerview功能 func

我正在用swift开发一个应用程序,其中一个页面有两个TableView。每个表视图可以有用户想要的任意多行

假设A表是关于猫的,B表是关于狗的。表A中每一行的第一列是带有猫类型的pickerview,表B中每一行的第一列是带有狗类型的pickerview,当用户从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的评论,将表比较更改为名称,而不是字符串。

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

您可以使用didSelectRowAtIndexPath触发选择器吗?这样您就可以可靠地知道选择了什么tableview和什么单元格(行)。在选择器的选择事件中,您可以更新基础数据并使用重载更新表视图

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


或者,您可以向单元格的textfield标记中插入一些附加信息,以便在UITextFieldDelegate中使用。

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