UITableView numberOfSectionsInTableView и numberOfRowsInSection трижды вызывается при начальной загрузке

Я делаю REALLY BASIC UITableView проект без какого-либо источника данных. Я просто отображаю "1" на первой и единственной ячейке.

я returning 1 в обоих numberOfSectionsInTableView а также numberOfRowsInSection, Я также делаю NSLog в обоих методах просто указав название соответствующих методов.

При начальной загрузке я получаю это:

SomeShit[27511:936083] number of sections
SomeShit[27511:936083] number of rows in section
SomeShit[27511:936083] number of sections
SomeShit[27511:936083] number of rows in section
SomeShit[27511:936083] number of sections
SomeShit[27511:936083] number of rows in section

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

РЕДАКТИРОВАТЬ:

Что я делаю в viewDidLoad,

self.tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
[self.view addSubview:self.tableView];

self.tableView.dataSource = self;
self.tableView.delegate = self;

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

3 ответа

Решение

Делегат и источник данных предназначены для обслуживания реализации табличного представления, и методы могут вызываться несколько раз. Вы не должны беспокоиться о деталях реализации табличных представлений, просто убедитесь, что ваши ответы последовательны (т.е. вы можете ответить правильно в любой момент времени, и ответы не меняются без вызова reloadData).

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

Вы сделали предположение, что их нужно вызывать только один раз, но, как вы показали, это неверное предположение.

После рассмотрения документации для UITableView а также UITableViewDataSource Единственное обещание - это.

-[UITableView numberOfSections]:

обсуждение

UITableView получает значение, возвращаемое этим методом, из своего источника данных и кэширует его.

Это означает, что вы не можете знать, как звонит -[UITableView numberOfSections] будет переписываться со звонками на -[UITableViewDataSource numberOfSectionsInTableView:],

Хуже того, количество вызовов этих методов может (и может) изменяться в разных версиях iOS.


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

Вы можете попытаться выяснить, что вызывает эти перезагрузки. Перейдите в раздел точек останова (1), нажмите кнопку "плюс" (2). Затем добавьте символьную точку останова с -[UITableView reloadData] в поле "символ".

Затем запустите ваше приложение и посмотрите трассировку стека вызовов методов. Вы сможете выяснить причину такого поведения.

Другие вопросы по тегам