TableViewCell 中的 PickerView 可以工作但不能更新

Posted

技术标签:

【中文标题】TableViewCell 中的 PickerView 可以工作但不能更新【英文标题】:PickerView in TableViewCell works but not Update 【发布时间】:2020-06-17 02:17:46 【问题描述】:

我做了一个简单的应用程序来练习。我是编程初学者。

首先我会详细解释我做了什么以及我想做什么。

为数据创建一个 Swift 文件:

class done 
    var meal: [String] = ["tomato","banana","potato","peanuts"]

ViewController 设置我有一个文本字段和一个按钮可以转到下一页,这将添加该人输入的文本字段的数据并将添加到我的膳食数据列表中:

import UIKit

class ViewController: UIViewController 

    var data = done()
    @IBOutlet weak var textField: UITextField!

    @IBOutlet weak var button: UIButton!

    override func viewDidLoad() 
        super.viewDidLoad()
        print("Data now : \(data.meal)")
    

    @IBAction func buttonaction(_ sender: UIButton) 
        var newitem = textField.text ?? ""
        if textField.text == "" 
            newitem = "empty"
        
        data.meal.append(newitem)
        performSegue(withIdentifier: "toView", sender: self)
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "toView" 
        let successVCG = segue.destination as! TableViewController
            successVCG.data = self.data
        
    

我有第二个 ViewController,它将显示在带有 TableViewcell 的 TableView 中,并且在里面我的每一行都有一个 Pickerview..

import UIKit

class TableViewController: UIViewController
    @IBOutlet weak var table: UITableView!
    var data = done()

    override func viewDidLoad() 
        super.viewDidLoad()
        print("Transfert Data OK :  \(data.meal)")
        table.delegate = self
        table.dataSource = self
    

    @IBAction func `return`(_ sender: Any) 
        print(data.meal)
    

    @IBAction func update(_ sender: Any) 
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "toViewa" 
        let successVCG = segue.destination as! ViewController
            successVCG.data = self.data
        
    


extension TableViewController: UITableViewDelegate, UITableViewDataSource 

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
        return 300
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 2
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
         if let cell = tableView.dequeueReusableCell(withIdentifier: "cellule") as? TableViewCell 
                    return cell
                
                    let cell2 = UITableViewCell(style: .subtitle, reuseIdentifier: nil)
                    return cell2
    

而且是TableViewCell的配置

import UIKit

class TableViewCell: UITableViewCell 

    @IBOutlet weak var picker: UIPickerView!
    var data = done()

    override func awakeFromNib() 
        super.awakeFromNib()
        picker.delegate = self
        picker.dataSource = self
    


extension TableViewCell: UIPickerViewDataSource, UIPickerViewDelegate 

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

    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int 
        return data.meal.count
    

    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? 
        return data.meal[row]
    

当我在变量中添加新内容时,Picker 视图会正确显示 data.meal,但不会显示 Updater。

在我的印刷品中。我在 ViewController 和 TableViewController 中看到了新的数据更新,但我尽我所能学习。无法更新 PickerView。我无法在 TableViewCell 中发送新值...请帮助。非常感谢你。喜欢编码!

【问题讨论】:

我自己用 *** 找到的。我终于明白了。我在 AppDelegate 中创建了我的 var 并完成了。它的工作!!!! 【参考方案1】:

这是因为您没有在表格视图单元格中实现pickerView(_:didSelectRow:inComponent:) 选择器视图的委托方法。因此,即使用户从您的选择器视图中选择了一个新行,这些更改也不会反映在您的数据变量中。您可以实现此方法并在此方法中相应地更改您的数据模型。

我注意到的另一件事是,您没有将数据从父视图传递到表格视图单元格,因此表格视图单元格中的数据变量永远不会获取最新数据。您可以在表格视图的 cellForRow(at:) 方法中简单地将数据传递到您的单元格。

另外,我建议您将数据模型命名为不同于 done 的名称。这个名字有点令人困惑(因为它通常指的是一个动作),而且大写具有误导性,因为例如当你在代码中编写 var done = done() 时,感觉就像你在调用一个函数或一个闭包,而,据我了解,您实际上是在初始化数据模型。

这是因为在 Swift 中,您会按照约定命名所有方法、函数和变量,使用 骆驼小写(例如 let myVariable: Double = 0),以及 中的结构、枚举和类等类型strong>大写驼峰(例如myData = MyDataModel())。

【讨论】:

谢谢,我现在清楚地了解缺少什么。但我什至不知道在代码中添加什么。我添加了 func 'pickerView(_:didSelectRow:inComponent:)' 但我不知道在代码和委托中之后要做什么......是的,我看到我没有将数据传递给我的 tableviewcell 但是如何我可以这样做吗? ...对于大写字母和我的班级名称没关系,我只是忘记了。非常感谢!!

以上是关于TableViewCell 中的 PickerView 可以工作但不能更新的主要内容,如果未能解决你的问题,请参考以下文章

tableviewcell 中的图像不会立即出现

我的 UITapGestureRecognizer 影响 TableViewCell 中的所有元素

如何将 viewController 中的数据分配给 tableViewCell 标签?

如何更改特定 TableViewCell 中的按钮颜色

按下 tableViewCell 中的按钮时打开一个新的 VC

didSelectRowAtIndexPath 中的 tableViewCell 附件类型问题