36 votes

Comment initialiser une cellule de table de style prototype personnalisée dans les storyboards iOS 5?

Je suis la conversion sur iOS 5 et story-boards. Quand j'ai une table avec vue de cellule par défaut de style, tout fonctionne bien.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifierFromStoryboard"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyIdentifierFromStoryboard"];
    }
    return cell;
}

J'ai vu des exemples où le "si (cellule == nil)" bloc est supprimé. Cependant, si je la sors, mon application se bloque avec le message: "UITableView de la source de données doit retourner une cellule de tableView:cellForRowAtIndexPath:". Ce n'est pas un problème, car il fonctionne comme indiqué ci-dessus.

Mon problème est que je veux utiliser un style personnalisé pour la cellule et ne peut donc pas utiliser initWithStyle. Comment initialiser une cellule personnalisé que j'ai conçu sur le storyboard?

L'ancien pré-5 app avait une plume et la classe qui a utilisé quelque chose comme ça, mais maintenant, je suis en utilisant la table de montage séquentiel.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MyCustomTableCell *cell = (MyCustomTableCell *) [tableView dequeueReusableCellWithIdentifier:@"MyCustomIdentifier"];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyCustomTableCell" owner:self options:nil];
        cell = (MyCustomTableCell *) [nib objectAtIndex:0];
    }
    return cell;
}

39voto

Alex Points 1065

Par ici

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    return cell;
}
 

9voto

OSXMonk Points 431

Cela a fonctionné parfaitement pour moi (Xcode 4.5.2 et iOS 6.0):

 -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];

    if( cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }

    UILabel *title = (UILabel*) [cell viewWithTag:1000];
    UILabel *summary = (UILabel*) [cell viewWithTag:1001];
    [title setText:[ tableMainTitle objectAtIndex:indexPath.row]];
    [summary setText:[ tableSubTitle objectAtIndex:indexPath.row]];
    return cell;
}
 

Important: N'oubliez pas les paramètres délégué et source de données.

8voto

jemeshsu Points 883

Si vous chargez votre contrôleur de vue contenant la tableview en utilisant:

 MyViewController *myViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MyViewController"];
 

Ensuite, à l'intérieur de cellForRowAtIndexPath vous n'avez besoin que d'une ligne:

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

dequeueReusableCellWithIdentifier instanciera une cellule s'il n'en existe aucune.

0voto

fftoolbar Points 85

Je pense que celui-ci fonctionne très bien. J'essayais de bien comprendre la situation depuis quelque temps et merci, cela fonctionnait .. eh bien, je le faisais lorsque j'essayais d'allouer une cellule que j'allouais à l'aide de la classe de cellule générale au lieu de celle que j'avais créée

donc je faisais cela, donc c'est la raison pour laquelle cela n'a pas fonctionné

 cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
 

donc au lieu de UITableViewCell allouer la cellule avec votre classe, ainsi avec l'exemple ci-dessus "CustomCell"

Merci encore

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X