PickerView в TableViewCell работает, но не обновляется - PullRequest
0 голосов
/ 17 июня 2020

Я сделал простые приложения для практики. Я новичок в программировании.

Прежде всего я подробно объясню, что я сделал и что хочу делать.

Создать файл 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, который будет отображаться в TableView с TableViewcell, а внутри у меня есть 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]
    }
}

Представление «Выбор» правильно отображает data.meal, но никогда не обновляет, пока я добавляю новые данные в переменную.

В моем отпечатке. Я вижу новое обновление данных в ViewController и TableViewController, но я стараюсь изо всех сил в процессе обучения. Не удается обновить PickerView. Я не могу отправить новое значение в TableViewCell ... m Пожалуйста, помогите. Большое спасибо. Люблю кодить!

1 Ответ

0 голосов
/ 17 июня 2020

Это связано с тем, что вы не реализуете метод делегата представления средства выбора pickerView(_:didSelectRow:inComponent:) в ячейке представления таблицы. Таким образом, даже если пользователь выберет новую строку в окне выбора, изменения просто не отразятся в вашей переменной данных. Вы можете реализовать этот метод и соответствующим образом изменить свою модель данных внутри этого метода.

Еще я заметил, что вы не передаете свои данные из родительского представления в ячейку представления таблицы, поэтому переменная данных в ячейке представления таблицы никогда не появляются последние данные. Вы можете просто передать данные в свою ячейку с помощью метода cellForRow(at:) представления таблицы.

Также я бы порекомендовал вам назвать свою модель данных как-то иначе, чем done. Это имя сбивает с толку (потому что обычно оно относится к действию), а использование заглавных букв вводит в заблуждение, потому что, например, когда в вашем коде вы пишете var done = done(), кажется, что вы вызываете функцию или закрытие, а насколько я понимаю, вы фактически инициализируете свою модель данных.

Это потому, что в Swift вы по соглашению называете все свои методы, функции и переменные, используя нижний регистр (например, let myVariable: Double = 0), а такие типы, как структуры, перечисления и классы в верхний регистр (например, myData = MyDataModel()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...