Как у меня есть UITableView с двумя различными типами ячеек и настроить каждый из макетов ячеек программно, а не через раскадровку?



Ранее я установил это с помощью раскадровки, перетащив UILabels, расположив их и определив их размер на UITableViewCell, на который я их перетащил, а затем сделал другую версию этого для другого UITableViewCell.

Например, как показано ниже (но на картинке они еще не настроены с помощью меток):

Введите описание изображения здесь

Затем в источнике данных я просто проверю идентификатор и в зависимости от того, какой идентификатор был, настрою ячейку соответственно.

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

Но мой вопрос: Когда я делаю это программно, как я могу сказать, какая ячейка является какой, чтобы я мог настроить макет UILabels соответственно? С собой раскадровка я, очевидно, могу просто перетащить UILabel на каждый из них, но когда это делается программно и настраивается UIView, я не знаю, как сказать: "Эй, если идентификатор такой, добавьте UILabels так", потому что UIViews не знают никаких идентификаторов.

В основном структура выглядит так:

UITableView - > UITableViewCell -> CellFront (UIView) & CellBack (UIView)

А внешний вид ячейки определяется метками, добавленными в UIView CellFront. Но есть еще двое смотрят на клетки, и я не знаю, как это сделать без раскадровки.

171   3  

3 ответов:

Хотя UIView s не знают идентификаторов, у них есть свойство под названием 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;
    }
}
    Ничего не найдено.

Добавить ответ:
Отменить.