Подтвердить что ты не робот

Как работает cellForRowAtIndexPath?

Я прочитал документацию на яблоко, и это не понятно для такого новичка в Objective-C как я. Я пытаюсь реализовать многоколоночный UITableView, следуя этому ссылке, и он просто не работает, поэтому мне нужно понять, как работает cellForRowAtIndexPath, для меня лично этот метод кажется довольно сложным.

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

Я попытаюсь сломать его (пример из documention)

/* 
 *   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).

Ответ 3

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

В Objective 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
}