Добавление нескольких пользовательских ячеек в UITableView - PullRequest
7 голосов
/ 07 апреля 2011

Хотя это один из самых часто задаваемых вопросов, но я не смог найти ни одного исчерпывающего ответа.Мне нужно иметь пользовательские ячейки в UITableView.Некоторые содержат метки или текстовые поля, а некоторые с изображениями и кнопками.Я сделал отдельные классы для каждого типа клеток.Я использую таблицу GroupStyle с несколькими разделами.Прямо сейчас я добавляю ячейки в cellForIndexPath с switch-case для секции и if-else для строк в секции:

id cell;
switch(indexPath.section) {
    case 0:
           if(indexPath.row==0) {
               CellA *cell = [[[CellA alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           else if(indexPath.row==1) {
               CellB *cell = [[[CellB alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           break;
    case 1:
           if(indexPath.row==0) {
               CellC *cell = [[[CellC alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           break;
    default:
            break;
}
return cell;

Я также должен вернуть ячейку в конце, потому что из-за определения ячеек внутри кодаблоки, клетка становится неузнаваемой.Чтобы решить эту проблему, я объявил ячейку с id сверху. Но я знаю, что это не правильный путь.Как я могу решить эту проблему и разрешить проблему с несколькими типами ячеек?

На данный момент имеется 4-5 строк, которые умещаются на одном экране и не нуждаются в прокрутке.Итак, я не использую клетки повторно.Но больше строк будет втискиваться во время редактирования.А в другой таблице есть еще ряды, которые могут прокручиваться на экране.Это означает, что я должен повторно использовать клетки.Итак, вторая часть моего вопроса:Как я могу использовать несколько пользовательских ячеек?

Ответы [ 2 ]

11 голосов
/ 07 апреля 2011

Чтобы ответить на ваш первый вопрос, вы также можете вернуть nil, так как у вас нет хорошего значения для возврата.Если он когда-нибудь попадет в этот случай, будет сгенерировано исключение;как и сейчас, он, скорее всего, даст вам EXC_BAD_ACCESS где-нибудь внутри кода платформы.

Чтобы ответить на ваш второй вопрос, каждый тип ячейки должен иметь уникальный reuseIdentifier.Например, все CellA могут иметь reuseIdentifier @ "CellA".Затем вы будете использовать их точно так же, как и в случае, когда все ячейки одинаковы: когда вам нужен вызов CellA [tableView dequeueReusableCellWithIdentifier:@"CellA"], когда вам нужен вызов CellB [tableView dequeueReusableCellWithIdentifier:@"CellB"] и так далее.Например,

    case 0:
        if (indexPath.row == 0) {
            CellA *cell = [tableView dequeueReusableCellWithIdentifier:@"CellA"];
            if (!cell) {
                cell = [[[CellA alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellA"] autorelease];
            }
            // configure cell
            return cell;
        }
        else if (indexPath.row == 1) {
            CellB *cell = [tableView dequeueReusableCellWithIdentifier:@"CellB"];
            if (!cell) {
                cell = [[[CellB alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellB"] autorelease];
            }
            // configure cell
            return cell;
        }
        break;
    case 1:
        if (indexPath.row == 0) {
            CellC *cell = [tableView dequeueReusableCellWithIdentifier:@"CellC"];
            if (!cell) {
                cell = [[[CellC alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellC"] autorelease];
            }
            // configure cell
            return cell;
        }
        break;
0 голосов
/ 11 февраля 2016

Добавление UITableView в UIView.Добавьте пользовательские ячейки, свяжите пользовательские классы ячеек и внедрите делегаты -UITableviewDelegate и UITableViewDataSource.

case 1: две пользовательских ячейки в табличном представлении

func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

  var cell: CustomCell!

  if indexPath.row == 0{
    cell = tableView.dequeueReusableCellWithIdentifier("Cell1ID", forIndexPath: indexPath) as CustomCell
    //set cell2
  }
  if indexPath.row >= 1{
    cell = tableView.dequeueReusableCellWithIdentifier("Cell2ID", forIndexPath: indexPath) as CustomCell
    let cons = aArray[indexPath.row - 1]
    // set cell2 
  }
  return cell
}

case 2: альтернативное отображение пользовательских ячеек (т. е. с использованием uisegmentcontrol)

var CellIdentifier: String = "Cell1ID"

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
       if (CellIdentifier == "Cell1ID")
    {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! FirstTableViewCell

//additional code
return cell

}
else {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! SecondTableViewReportsCell

//Additional code

return cell
}
}

вариант 3: альтернативные настраиваемые ячейки (т.е. нечетные четные)

var CellIdentifier: String = "Cell1ID"

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

var cell: CustomCell!

if (indexPath.row % 2 == 0) {

let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! FirstTableViewCell

}
else
{
        let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier)! as! SecondTableViewCell
}
return cell
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...