Мой TableView не изменился после перезагрузки данных - PullRequest
0 голосов
/ 27 июня 2019

Я написал класс, который позволяет мне просто создавать несколько таблиц. Когда я звоню в этот класс в первый раз, все работает хорошо. Но когда я изменяю некоторые данные и перезагружаю таблицу, ничего не меняется.

Пример кода:

class TestViewController: UIViewController {

    var arrData = ["a","b","c"]
    var myTableView: MyTableView?
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()    
        myTableView = MyTableView(table: tableView, data: arrData)
    }

    @IBAction func buttonTapped(_ sender: UIButton) {
        arrData = ["d","e","f"]
        myTableView!.tableView.reloadData() //=> Not change anything
    }
}


class MyTableView: NSObject, UITableViewDataSource {

    var tableView: UITableView
    var data: Array<String>

    init(table: UITableView, data: Array<String>) {
        self.data = data
        self.tableView = table
        super.init()

        self.tableView.dataSource = self

        self.tableView.register(MyTableViewCell.self, forCellReuseIdentifier: "myCell")
    }



    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.data.count
    }



    public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = self.tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath) as! MyTableViewCell

        cell.textLabel!.text = self.data[indexPath.row]
        return cell
    }

}


class MyTableViewCell : UITableViewCell {
    //something here
}

Когда представление было загружено, таблица имеет 3 строки: a, b, c. Когда я нажимаю кнопку, ничего не меняется (ожидается: d, e, f)

Пожалуйста, помогите мне!

1 Ответ

1 голос
/ 27 июня 2019

Массивы Swift копируются по значению, поэтому строка self.data = data примет копию вашего массива.Дальнейшее изменение содержимого массива источника не будет отражено в копии в вашем MyTableView.

Вам нужно будет снова передать массив и взять вторую копию, чтобы обновить таблицу, например, написать метод в MyTableView, подобный следующему: -

func setNewValues(data: Array<String>)
{ 
  self.data = data
  self.tableView.reloadData()
}

ивызовите это из вашей buttonTapped функции, то есть:

@IBAction func buttonTapped(_ sender: UIButton) {
    arrData = ["d","e","f"]
    myTableView!.setNewValues(data: arrData)
}

Будьте осторожны с развернутой силой myTableView, хотя - я бы заменил это!с '?'.

...