显示来自pickerview的数据

时间:2017-11-17 09:05:40

标签: ios swift uitableview uipickerview

我设计了一个带有文本字段的tableview单元格,用于pickerview。我已经在我的tableview中加载了其中2个单元格。为了显示来自pickerview的数据,这就是我在cellForRowAt...

中所做的
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell: sellTableViewCell = tableView.dequeueReusableCell(withIdentifier: "sellProductIdentifier") as! sellTableViewCell
        cell.delegate = self

        let pickerView = UIPickerView()
        pickerView.delegate = self
        cell.pickerField.inputView = pickerView
        cell.pickerField.text = myData[0]//myData is an array with values from 1-10

        myCell = cell //The issue seems to be here.

        return cell
    }

我给出的选择器视图方法就是这样......

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return myData.count
}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return myData[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    myCell.pickerField.text = myData[row]
}

问题是,如果我点击第二个选择器视图,我选择的值将分配给文本字段。但是当我从第一个字段中选择一个值时,该值显示在第二个字段而不是第一个字段中。

编辑:这是我在cellForRowAt ...

中的代码
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {



    let cell: sellTableViewCell = tableView.dequeueReusableCell(withIdentifier: "sellProductIdentifier") as! sellTableViewCell
    cell.delegate = self

    let pickerView = MyPickerView()
    pickerView.cell = cell
    pickerView.delegate = self
    cell.qtyPickerField.inputView = pickerView

    return cell
}

这是选择器视图方法......

        func numberOfComponents(in pickerView: UIPickerView) -> Int {
            return 1
        }

        func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
            return myData.count
        }

        func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
            return myData[row]
        }

        func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {


            if pickerView is MyPickerView {

                if let cell = (pickerView as! MyPickerView).cell {
                    let indexpath = self.tableview.indexPath(for: cell)
                    if let index = indexpath {
                        (pickerView as! MyPickerView).cell?.qtyPickerField?.text = myData[index.row]

    }
    }
    }

}

编辑2 。挑选者代码didSelectRow

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

if pickerView is MyPickerView {

        if let cell = (pickerView as! MyPickerView).cell {

            cell.qtyPickerField.text = myData[row]
            let indexPath = self.tableview.indexPath(for: cell)
            if let index = indexPath {
                (pickerView as! MyPickerView).cell?.qtyPickerField?.text = myData[index.row]
            }
        }

    }
}

3 个答案:

答案 0 :(得分:1)

问题始于

myCell = cell;

您将始终拥有最新单元格的实例。因此,在委托中分配值将在最近的调用中更新textField。

你在pickerView委托中可以做的是(Noob方式:p)

if let cell = tableView.cellForRow(at: INDEXPATH_OF_RESPECTIVE_ROW) { 
    "get text field instance and assign value."
}

答案 1 :(得分:0)

您需要在自定义单元类sellTableViewCell

中实现Picker视图委托

您应该在自定义单元格中实现选择器委托,这样您就不必对单元格进行引用并更新该单元格的文本字段中的文本。如果您在单元格中实现了这些委托方法,则必须更新该单元格实例的文本字段中的文本。所以不会在不同的单元格中混合文本。同时,您必须在数组模型对象中为数组中的indexPath更新此值,以便在滚动时保留该值。请参阅我在this链接上的回答,了解如何实施。

答案 2 :(得分:0)

问题:

正如有人在上面的回答中提到的那样

myCell = cell //问题似乎就在这里。

是罪魁祸首。因为每次cellForRowAtIndexPath完成后,myCell都会引用返回的最后一个单元格而不是负责显示pickerView的单元格。

首先从myCell = cell

中删除cellForRowAtIndexPath

解决方案:

现在你所要做的就是弄清楚哪个单元格中包含了负责呈现pickerView的textField。

现在可以有多种解决方案。这是一个

第1步:创建PickerView的子类

class MyPickerView : UIPickerView {
    weak var cell : MyTableViewCell? = nil
}

在代码中使用此pickerView而不是UIPickerView

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let cell: sellTableViewCell = tableView.dequeueReusableCell(withIdentifier: "sellProductIdentifier") as! sellTableViewCell
        cell.delegate = self

        let pickerView = MyPickerView()
        pickerView.cell = cell //pass cells reference 
        pickerView.delegate = self
        cell.pickerField.inputView = pickerView
        //other code
}

最后

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        if pickerView is MyPickerView {
            if let cell = (pickerView as! MyPickerView).cell {
                cell.textField?.text = myData[row]
                let indexPath = self.tableView.indexPath(for: cell)
                if let index  = indexPath {
                    //now go ahead and update your data
                }

            }

        }
    }

修改

此解决方案可能有多种变体。有些人会同意将单元格引用传递给选择器视图很好,因为单元格无论如何都会保持强大的引用选择器和选择器只能保持对单元格的弱引用。

我个人觉得将indexPath作为一个param传递给picker更有意义。最后,当用户选择某些内容时,您将使用传递给选择器的indexPath来获取对单元格的引用,最后更新单元格的textField。

<强> O / P:

enter image description here

编辑2:

由于OP仍然困惑,我决定修改他的编辑2并将其添加为答案的一部分

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

        if pickerView is MyPickerView {

            if let cell = (pickerView as! MyPickerView).cell {

                cell.qtyPickerField.text = myData[row]
                let indexPath = self.tableview.indexPath(for: cell)
                if let index = indexPath {
                    //this is only to show you how you can access indexPath
                    //and in future if you need to update your data source you can use it
                    //for now ignore this :)
                }
            }

        }
    }

应该足够好:)希望它有帮助:)