快速重新加载 PickerView 的特定行

Posted

技术标签:

【中文标题】快速重新加载 PickerView 的特定行【英文标题】:Reloading Particular Row of PickerView in swift 【发布时间】:2017-10-19 11:25:11 【问题描述】:

我有一个由标签和图像组成的pickerView。我正在更新PickerView删除该特定时的图像。但要显示图像的变化,我必须重新加载pickerView。当我重新加载它会回到第一行。有没有办法只重新加载特定的pickerView行?

代码:

if selectedRows.contains(contactPerson.text!) 
                      FilteredQuestion_Images[row] = UIImage(named: "Unchecked Checkbox-26")!
                    let image = FilteredQuestion_Images[row]
                    imageView = UIImageView(image: image)

                    if let itemToRemoveIndex = selectedRows.index(of: contactPerson.text!) 
                        selectedRows.remove(at: itemToRemoveIndex)
                        ContactPersons_Multiple.remove(at: itemToRemoveIndex)
                    

                    self.dropdownPicker.reloadAllComponents()

                else 


                    selectedRows.append(contactPerson.text!)
                    self.imageName = "Checked Checkbox-26"

                    FilteredQuestion_Images[row] = UIImage(named: "Checked Checkbox-26")!

                    let image = FilteredQuestion_Images[row]
                    imageView = UIImageView(image: image)

                    self.dropdownPicker.reloadAllComponents()

                    
                

ViewForRow 代码:

     func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView 
  let customeView = UIView(frame: CGRect(x: 0, y: 0, width: self.dropdownPicker.rowSize(forComponent: 0).width, height: 30))

            // for label
            let label = UILabel(frame: CGRect(x: 0, y: 0, width: customeView.frame.width - 35, height: 30))
            label.textAlignment = .left

            label.text = self.ContactPers[row]

            if FilteredContactsSelected == true 
                label.text = FilteredContactsNames[row]
            


            let image = FilteredQuestion_Images[row]//UIImage(named: imageName)
            imageView = UIImageView(image: image)



            imageView?.frame = CGRect(x: self.dropdownPicker.rowSize(forComponent: 0).width - 36 , y: 0, width: 26, height: 26)

            customeView.addSubview(imageView!)
            customeView.addSubview(label)//pickerLabel)

            return customeView//pickerLabel

【问题讨论】:

【参考方案1】:

没有这样的系统方法。但是,如果您使用的是自定义视图,则可以尝试以下操作:

(pickerView.view(forRow: <#T##Int#>, forComponent: <#T##Int#>) as? MyCustomView).image = newImage

编辑:

首先你需要为你的自定义视图元素添加视图标签(你可以为此定义两个常量):

label.tag = 10
imageView.tag = 20

在选择发生后,您需要刷新视图的状态。你可以这样做:

if let myView = pickerView.view(forRow: row, forComponent: 0) as? UIView,
        let label = myView.viewWithTag(10) as? UILabel,
        let imageView = myView.viewWithTag(20) as? UIImageView

        label.text = FilteredContactsNames[row]
        imageView.image = ilteredQuestion_Images[row]

【讨论】:

具体在哪里调用? 你实现了UIPickerViewDelegateoptional public func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -&gt; UIView方法吗? 是的,我正在使用它。 我已经在上面的问题中更新了我的 Codeof ViewForRow 请你用代码指导我如何做到这一点? 您好,我将在几分钟后用一些更详细的解释和代码示例更新我的答案。

以上是关于快速重新加载 PickerView 的特定行的主要内容,如果未能解决你的问题,请参考以下文章

除了部分的特定行之外,是不是可以重新加载 UITableView?

UIPickerView 不加载行

UIPicker 重新加载内容

快速单击其中一个 tableview 单元格内的按钮后重新加载 tableview

在uitableview中插入行并重新加载

对返回空数据的两个按钮使用相同的pickerView