web-dev-qa-db-fra.com

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

Je suis en train de convertir vers iOS 5 et les storyboards. Lorsque j'ai une vue sous forme de tableau avec un style de cellule par défaut, tout fonctionne correctement.

- (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 bloc "if (cell == nil)" est supprimé. Toutefois, si je le retire, mon application se bloque avec le message: "UITableView dataSource doit renvoyer une cellule de tableView: cellForRowAtIndexPath:". Ce n'est pas un problème parce que cela fonctionne comme indiqué ci-dessus.

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

L'ancienne application pré-5 avait une plume et une classe qui utilisait quelque chose comme ceci, mais maintenant j'utilise le story-board.

- (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;
}
36
Tom Kincaid

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;
}
39
Alex

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. 

9
OSXMonk

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

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

Ensuite, dans cellForRowAtIndexPath, vous n'avez besoin que d'une ligne:

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

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

8
jemeshsu

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

0
fftoolbar
static NSString *identifier=@"SearchUser";
SearchUserCell *cell=[tableView dequeueReusableCellWithIdentifier:identifier];
if (cell==nil)
{
    cell=[[SearchUserCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
}
return cell;
0
Anand