[英]PickerView in TableViewCell works but not Update
我做了一个简单的练习应用程序。 我是编程初学者。
首先,我将详细解释我做了什么以及我想做什么。
为数据创建一个 Swift 文件:
class done {
var meal: [String] = ["tomato","banana","potato","peanuts"]
}
ViewController 设置我有一个文本字段和一个按钮到 go 到下一页这将添加该人输入的文本字段的数据并将添加到我的膳食数据列表中:
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 中发送新值...请帮助。 非常感谢您。 喜欢编码!
这是因为您没有在表格视图单元格中实现pickerView(_:didSelectRow:inComponent:)
选择器视图的委托方法。 因此,即使用户从您的选择器视图中选择了一个新行,这些更改也不会反映在您的数据变量中。 您可以实现此方法并在此方法中相应地更改您的数据 model。
我注意到的另一件事是,您没有将数据从父视图传递到表格视图单元格,因此表格视图单元格中的数据变量永远不会获取最新数据。 您可以简单地将数据传递到表格视图的cellForRow(at:)
方法中的单元格。
另外,我建议您将数据命名为 model 与done
不同的名称。 这个名字有点令人困惑(因为它通常指的是一个动作),并且大写具有误导性,因为例如当你在代码中编写 var done = done()
时,感觉就像你在调用 function 或闭包,而据我了解,您实际上是在初始化数据 model。
这是因为在 Swift 中,您将按照惯例命名所有方法、函数和变量,使用小写驼峰式(例如let myVariable: Double = 0
),以及大写驼峰式的结构、枚举和类等类型(例如myData = MyDataModel()
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.