it-swarm.com.ru

iOS: как удалить многократно используемые ячейки "по умолчанию", фактически не имея ячейки в раскадровке

У меня есть несколько таблиц по умолчанию, такие как ячейка с заголовком или ячейка со значком слева и заголовок справа. 

Я не хочу добавлять эти ячейки в раскадровку и присваивать им идентификатор, возможно ли это сделать? 

это должно быть многоразовым, я знаю, как выделить новые одноразовые ячейки

Я попробовал ответы ниже, 

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];

должно быть правильно, но это очень утомительно и легко забыть

UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
   cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

Выше может быть лучше, так как он помещает все коды в одном месте, но при попытке dequeueReusableCellWithIdentifier: forIndexPath: (с indexPath) происходит сбой. 

  1. почему dequeueReusableCellWithIdentifier: forIndexPath аварийно завершает работу, а dequeueReusableCellWithIdentifier - нет? 
  2. если я не передам indexPath, можно ли повторно использовать ячейку
  3. если это можно использовать повторно, то зачем использовать dequeueReusableCellWithIdentifier: forIndexPath? 
29
OMGPOP

Если у вас нет раскадровки в вашей раскадровке, вы можете использовать dequeueReusableCellWithIdentifier: api для создания классической ячейки

UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
   cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}

Swift:

var cell : UITableViewCell!
cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
if cell == nil {
    cell = UITableViewCell(style: .default, reuseIdentifier: cellIdentifier)
}
48
Florian Burel

Вы можете удалить UITableViewCell из очереди без прототипа ячейки в раскадровке. Вам нужно зарегистрировать ячейку в вашей таблице для определенного идентификатора (строки). Вы бы сделали это так:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];

Вы можете сделать это в viewDidLoad, может быть. 

Затем вы можете удалить из очереди ячейку, используя этот идентификатор в вашем методе cellForRowAtIndexPath как обычно.

Правка:

Где MyCellIdentifier это константа, которую вы где-то определили, конечно.

12
JoeFryer

Swift 3.0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell: UITableViewCell = {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") else {
        return UITableViewCell(style: .default, reuseIdentifier: "cell")
        }
        return cell
    }()

    cell.textLabel?.text = anyArray[indexPath.row]

    return cell
}

Это хорошо, потому что дают клетку без упаковки.

9
Nik Kov

Вам нужно попытаться удалить из очереди ячейку, и если вы получите nil, то создайте ее. В файле XIB ячейки определите его идентификатор.

Установить идентификатор ячейки в файле пера:

Set cell identifier

Получить многоразовую ячейку или сделать новую:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"myCell";
    MyCell *cell = (MyCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        NSArray *t = [[NSBundle mainBundle] loadNibNamed:@"myCellXibFileName" owner:nil options:nil];
        for (id currentObject in t)
        {
            if ([currentObject isKindOfClass:[MyCell class]])
            {
                cell = (MyCell *)currentObject;
                break;
            }
        }
    }
    // Do whatever you want with the cell....
    return cell;
}
1
Aviel Gross

Откройте библиотеку компонентов, перетащите UITableViewCell в раскадровку TableView и выберите эту ячейку, чтобы открыть инспектор идентификации, затем выберите требуемый стиль по умолчанию и задайте идентификатор ячейки, такой же, как dequeueReusableCellWithIdentifier в вашем коде.

0
Linc