Как работает cellForRowAtIndexPath? - PullRequest
52 голосов
/ 10 ноября 2011

Я ПРОЧИТАЛ яблочную документацию, и это не понятно для такого новичка в Objective-C, как я. Я пытаюсь реализовать многоколонку UITableView, следуя этому примеру link , и он просто не работает, поэтому мне нужно понять, как работает cellForRowAtIndexPath, лично для меня этот метод кажется довольно сложным.

1) Что это возвращает? UITableViewCell? Но почему это выглядит так странно?

-(UITableViewCell *)tableView:(UITableView *)tableView 
  • Что это? Не могли бы вы объяснить?

2) Как он вызывается и что важнее, как мне подключить его к определенному UITableView ??? Что если у меня есть два UITableView с именами firstTableView и secondTableView, и я хочу, чтобы они были разными (для выполнения cellForRowAtIndexPath по-разному)? Как я должен связать мой UITableViews с этим

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

метод принимает NSIndexPath, а не UITableView. Что я буду делать?

Ответы [ 3 ]

96 голосов
/ 10 ноября 2011

Я постараюсь разбить его (пример из document )

/* 
 *   The cellForRowAtIndexPath takes for argument the tableView (so if the same object
 *   is delegate for several tableViews it can identify which one is asking for a cell),
 *   and an indexPath which determines which row and section the cell is returned for. 
 */ 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    /*
     *   This is an important bit, it asks the table view if it has any available cells
     *   already created which it is not using (if they are offScreen), so that it can
     *   reuse them (saving the time of alloc/init/load from xib a new cell ).
     *   The identifier is there to differentiate between different types of cells
     *   (you can display different types of cells in the same table view)
     */

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];

    /*
     *   If the cell is nil it means no cell was available for reuse and that we should
     *   create a new one.
     */
    if (cell == nil) {

        /* 
         *   Actually create a new cell (with an identifier so that it can be dequeued). 
         */

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"] autorelease];

        cell.selectionStyle = UITableViewCellSelectionStyleNone;

    }

    /*
     *   Now that we have a cell we can configure it to display the data corresponding to
     *   this row/section
     */

    NSDictionary *item = (NSDictionary *)[self.content objectAtIndex:indexPath.row];
    cell.textLabel.text = [item objectForKey:@"mainTitleKey"];
    cell.detailTextLabel.text = [item objectForKey:@"secondaryTitleKey"];
    NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"];
    UIImage *theImage = [UIImage imageWithContentsOfFile:path];
    cell.imageView.image = theImage;

    /* Now that the cell is configured we return it to the table view so that it can display it */

    return cell;

}

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

36 голосов
/ 10 ноября 2011

1) Функция возвращает ячейку для табличного представления да?Итак, возвращаемый объект имеет тип UITableViewCell.Это объекты, которые вы видите в строках таблицы.Эта функция в основном возвращает ячейку для табличного представления.Но вы можете спросить, как функция узнает, какую ячейку возвращать для какой строки, на что дан ответ во 2-м вопросе

2) NSIndexPath - это, по сути, две вещи -

  • Ваш раздел
  • Ваша строка

Поскольку ваша таблица может быть разделена на множество разделов и каждый со своими собственными строками, этот NSIndexPath поможет вам точно определить, какой раздел и какая строка.Они оба целые числа.Если вы новичок, я бы сказал, попробуйте только один раздел.

Он вызывается, если вы реализуете протокол UITableViewDataSource в вашем контроллере представления.Более простой способ - добавить класс UITableViewController.Я настоятельно рекомендую это, потому что у Apple есть некоторый код, написанный для вас, чтобы легко реализовать функции, которые могут описать таблицу.В любом случае, если вы решите реализовать этот протокол самостоятельно, вам нужно создать объект UITableViewCell и вернуть его для любой строки.Взгляните на ссылку на класс, чтобы понять повторное использование, поскольку ячейки, отображаемые в табличном представлении, используются снова и снова (кстати, это очень эффективный дизайн).

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

6 голосов
/ 08 мая 2015

В основном это проектирование вашей ячейки. Для каждой ячейки вызывается cellforrowatindexpath, а номер ячейки определяется по indexpath.row, а номер раздела - по indexpath.section.Здесь вы можете использовать метку, кнопку или текстовое изображение, которые вы хотите, которые обновляются для всех строк в таблице.Ответ на второй вопрос В ячейке для строки в пути индекса используйте оператор if

В задаче C

-(UITableViewCell *)tableView:(UITableView *)tableView  cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

 NSString *CellIdentifier = @"CellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if(tableView == firstTableView)
  {
      //code for first table view 
      [cell.contentView addSubview: someView];
  }

  if(tableview == secondTableView)
  {
      //code for secondTableView 
      [cell.contentView addSubview: someView];
  }
  return cell;
}

В Swift 3.0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{
  let cell:UITableViewCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as UITableViewCell!

  if(tableView == firstTableView)   {
     //code for first table view 
  }

  if(tableview == secondTableView)      {
     //code for secondTableView 
  }

  return cell
}
...