【问题标题】:PickerView in TableViewCell works but not UpdateTableViewCell 中的 PickerView 可以工作但不能更新
【发布时间】: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 中发送新值...请帮助。非常感谢你。喜欢编码!

【问题讨论】:

  • 我自己用 stackoverflow 找到的。我终于明白了。我在 AppDelegate 中创建了我的 var 并完成了。它的工作!!!!

标签: ios swift xcode uitableview pickerview


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,我现在清楚地了解缺少什么。但我什至不知道在代码中添加什么。我添加了 func 'pickerView(_:didSelectRow:inComponent:)' 但我不知道在代码和委托中之后要做什么......是的,我看到我没有将数据传递给我的 tableviewcell 但是如何我可以这样做吗? ...对于大写字母和我的班级名称没关系,我只是忘记了。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 2013-03-29
  • 2021-10-02
  • 2012-11-03
  • 2014-02-15
  • 2020-05-31
  • 1970-01-01
相关资源
最近更新 更多