选择器值到 tableView swift

Picker Value into tableView swift

第一个文本字段是一个 Int 值,您可以在其中插入当前已售出的商品。第二个文本字段,我在其中获取一些 Int 值并使用按钮添加到 tableView。您添加到第二个文本字段中的值是主值(在这种情况下为 2500)。效果很好。

我的问题是将 PickerValue 归因于 TableRow 值。它在工作,但不像我想要的那样。

我想在单击按钮时保存 pickerValue。但是当我输入一个新值时,它会改变 pickerValue 的所有行。在这种情况下,您可以看到两行“电话”。通常它会是“电话”和其他东西(“maison”或“房子”)。

你知道为什么会这样吗?希望你能明白我的意思。

problem with picker value save into table view (gif)

    @IBAction func addBtn(_ sender: Any) {
    
    view.endEditing(true)

    salaire = Int(salaireLabel.text!) ?? 0
    valeur =  Int(ressourceTextField.text!) ?? 0
    
    if  String(valeur) != "" {
        
        addBtnActivated = true
        
        restValueLabel.textColor = UIColor.blue
        
        arrayRessource.append(valeur)
        

        // modifie automatiquement le salaire
        restValueLabel.text = String(soustraction)
    
        tableRessourceOT.reloadData()
        
        // reset le champs
        ressourceTextField.text = ""
        picker.selectRow(0, inComponent: 0, animated: true)
    
    }

}

这是我正在使用的一些代码。我认为问题出在 tableview Func

var arrayPickerValue: [String] = ["", "maison", "telephone"] 

// ------------------------------ START PICKER ------------------------------------

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

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    print("-----arraypicker.count------")
    print(arrayPickerValue.count)
    return arrayPickerValue.count
}

// hauteur du picker pour que les images ne se supperpose pas / Picker height
  func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
 return 25
 }

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

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    stored = arrayPickerValue[row]
    print("-----stored dans func didselectrow------")
    print(stored as Any)
}

//------------------------ 结束选择器---------------- --------------------

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    let row = indexPath.row
    let value =  arrayRessource[row]

    
    cell.textLabel?.text = "- " + String(value) + " €"
        
  //  cell.detailTextLabel?.text =
    
    updateRestLabel()
    
    setRestLabel()
  
    return cell
}

这是我的出口:

@IBOutlet weak var tableRessourceOT: UITableView!

然后我的 arrayRessource :

    var arrayRessource: [Int] = [] {
    didSet {
        if oldValue != arrayRessource {
            userDefault.setValue(arrayRessource, forKey: arrayKey)
        }
    }
}

并调用函数 :

    func getArray() {
    if let newArray = userDefault.array(forKey: arrayKey) as? [Int] {
        arrayRessource = newArray
    }
}

你的问题不是很清楚
但是,我会尝试从您的代码中提取的内容中提供一些帮助。

我假设 restValueLabel 不是你细胞内的东西?大概是你截图中的绿色标签“2500”吧?
如果是这样,请不要在 cellForRow(at:) 中设置它。每次单元格变得可见时都会调用此方法,并且应该 用于根据您的数据源配置该单元格 (arrayRessource)。

而是创建一个方法 updateRestValueLabel() 来迭代您的数据源,进行计算并为您的 restValueLabel 设置适当的值。每次您的数据源更改时调用该方法,因此连同 tableRessourceOT.reloadData().

您的代码也存在一些风格问题(例如,避免强制展开 ! 除非您有充分的理由使用它)但这超出了此处的范围。

问题出在我的数组是 Int 数组,而我的 pickerValue 是 String 数组。

数组不能是 String 数组和 Int 数组。

    var arrayRessource: [String] = [] {
    didSet {
        if oldValue != arrayRessource {
            userDefault.setValue(arrayRessource, forKey: arrayKey)
        }
    }
}

感谢您的建议,我正在进步并尽我所能