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] в поле "символ".
Затем запустите ваше приложение и посмотрите трассировку стека вызовов методов. Вы сможете выяснить причину такого поведения.