web-dev-qa-db-fra.com

iOS: comment retirer les cellules "par défaut" réutilisables sans avoir réellement une cellule dans le storyboard

J'ai plusieurs tables les cellules par défaut telles que celle avec le titre, ou celle avec l'icône à gauche et le titre à droite. 

Je ne veux pas ajouter ces cellules dans le storyboard et leur attribuer un identifiant, est-ce possible de le faire? 

il doit être réutilisable, je sais comment allouer de nouvelles cellules non réutilisables

J'ai essayé les réponses ci-dessous, 

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

devrait être correct, mais c'est très fastidieux et facilement oublier

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

Ce qui précède est peut-être préférable, car il regroupe tous les codes au même endroit, mais lorsque j'essaie dequeueReusableCellWithIdentifier: forIndexPath: (avec indexPath), il se bloque. 

  1. pourquoi dequeueReusableCellWithIdentifier: forIndexPath se bloque-t-il alors que dequeueReusableCellWithIdentifier ne le fait pas? 
  2. si je ne passe pas dans indexPath, la cellule est-elle réutilisable
  3. s'il est réutilisable, quelle est l'utilisation de dequeueReusableCellWithIdentifier: forIndexPath? 
29
OMGPOP

Si vous n'avez pas de cellule prototype dans votre story-board, vous pouvez utiliser le dequeueReusableCellWithIdentifier: api pour créer une cellule classique.

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

Rapide:

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

Vous pouvez supprimer une file UITableViewCell sans avoir une cellule prototype dans votre scénario. Vous devez enregistrer la cellule avec votre table pour un identifiant spécifique (chaîne). Vous feriez ça comme ça:

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

Vous pouvez le faire dans viewDidLoad, peut-être. 

Ensuite, vous pouvez retirer de la file d'attente une cellule en utilisant cet identifiant dans votre méthode cellForRowAtIndexPath comme d'habitude.

Modifier:

MyCellIdentifier est une constante que vous avez définie quelque part, bien sûr.

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
}

C'est bien, parce que donner une cellule non emballée.

9
Nik Kov

Vous devez essayer de retirer la cellule de la file d'attente et, si vous obtenez nil, créez-la. Dans la cellule, le fichier xib définit son identifiant.

Définit l'identifiant de la cellule dans le fichier nib:

Set cell identifier

Obtenir une cellule réutilisable ou en fabriquer une nouvelle:

- (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

Ouvrez la bibliothèque de composants, faites glisser une UITableViewCell dans votre storyboard TableView et sélectionnez cette cellule pour ouvrir l'inspecteur d'identité, puis sélectionnez le style par défaut souhaité et définissez l'identificateur de cellule comme identique à l'identificateur dequeueReusableCellWithIdentifier dans votre code.

0
Linc