Swift TableViewDataSource Отдельный другой класс - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть два примера

Первый

override func viewDidLoad() {
    super.viewDidLoad();
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    tableView.dataSource = TableViewDataSource();
}

Второй

var dataSource:TableViewDataSource!;

override func viewDidLoad() {
    super.viewDidLoad();
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
    dataSource = TableViewDataSource();
    tableView.dataSource = dataSource;
}

Первый пример не работает, но второй работает. Разве это не одно и то же? И в чем разница между двумя примерами?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

UITableView dataSource - слабое свойство. Ваш первый пример не работает, потому что нет строгой ссылки на экземпляр TableViewDataSource, который вы создаете. Ко времени достижения конца viewDidLoad экземпляр освобождается и dataSource возвращается к nil.

Ваш второй пример работает, потому что ваше свойство dataSource вашего класса поддерживает строгую ссылку на экземпляр TableViewDataSource. Пока ваш контроллер представления существует, TableViewDataSource будет существовать, и источник данных табличного представления будет работать.

0 голосов
/ 30 апреля 2018

первый не работает, потому что вы должны установить сильную ссылку на него

tableView.dataSource = TableViewDataSource();

а у других здесь

var dataSource:TableViewDataSource!;

//

Если вы смотрели файл реализации делегата источника данных, он объявляется так:

weak open var dataSource:UITableViewDataSource?

осторожно смотрит на слабый , поэтому он не сохраняет присвоенные ему переменные, поэтому на другой экземпляр класса должны быть строго указаны ссылки

enter image description here

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