Как у меня есть UITableView с двумя различными типами ячеек и настроить каждый из макетов ячеек программно, а не через раскадровку?
Ранее я установил это с помощью раскадровки, перетащив UILabels, расположив их и определив их размер на UITableViewCell, на который я их перетащил, а затем сделал другую версию этого для другого UITableViewCell.
Например, как показано ниже (но на картинке они еще не настроены с помощью меток):

Затем в источнике данных я просто проверю идентификатор и в зависимости от того, какой идентификатор был, настрою ячейку соответственно.
Однако мне потребовалось больше настроек, чем я могу получить от раскадровки, так как каждая ячейка будет иметь два UIView (верхний и Нижний, чтобы позволить скольжение верхнего), поэтому я не могу сделать это с раскадровкой, так как я добавляю метки и все остальное в UIView программно.
Но мой вопрос: Когда я делаю это программно, как я могу сказать, какая ячейка является какой, чтобы я мог настроить макет UILabels соответственно? С собой раскадровка я, очевидно, могу просто перетащить UILabel на каждый из них, но когда это делается программно и настраивается UIView, я не знаю, как сказать: "Эй, если идентификатор такой, добавьте UILabels так", потому что UIViews не знают никаких идентификаторов.
В основном структура выглядит так:
UITableView - > UITableViewCell -> CellFront (UIView) & CellBack (UIView)
А внешний вид ячейки определяется метками, добавленными в UIView CellFront. Но есть еще двое смотрят на клетки, и я не знаю, как это сделать без раскадровки.
3 ответов:
Хотя
UIViews не знают идентификаторов, у них есть свойство под названиемtag, которое можно использовать для любых целей, которые вы хотите. Вы можете установить тег, скажем,1для ячеек одного типа и2для ячеек другого типа, а затем использовать тег для различения ячеек в коде. Кроме того, как только ваши представления помечены, вы можете вызватьviewWithTag:на содержащее представление и получить обратно представление сtag, которое вы хотите.
Если вы создаете ячейки исключительно в коде,то вы регистрируете свой подкласс UITableViewCell в методе viewDidLoad контроллера табличного представления. Этот метод устанавливает идентификатор. Затем вы используете этот идентификатор в cellForRowAtIndexPath: так же, как вы бы для xib или раскадровки созданной ячейки.
[самость.tableView registerClass: [mycellsubclass class] forCellReuseIdentifier:@ "MyIdentifier"];
Вот один из подходов:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // Adjust the condition to match your needs if (indexPath.row == 0) { static NSString *Identifier1 = @"CellType1"; // cell type 1 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier1]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier1]; // add subviews here } // set cell properties return cell; } else { static NSString *Identifier1 = @"CellType2"; // cell type 2 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier2]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier2]; // add subviews here } // set cell properties return cell; } }
Comments