web-dev-qa-db-fra.com

Comment insérer du texte dans un UITableViewCell sans cellule personnalisée

C'est sur l'iPhone 0S 2.0. Les réponses pour 2.1 sont également correctes, même si je ne connais aucune différence entre les tableaux.

Il semble qu'il devrait être possible de mettre du texte à la ligne sans créer de cellule personnalisée, car UITableViewCell contient par défaut une UILabel. Je sais que je peux le faire fonctionner si je crée une cellule personnalisée, mais ce n'est pas ce que j'essaie de faire - je veux comprendre pourquoi mon approche actuelle ne fonctionne pas.

J'ai découvert que l'étiquette était créée à la demande (étant donné que la cellule prend en charge l'accès au texte et aux images, elle ne crée donc pas la vue des données avant qu'elle ne soit nécessaire). Par conséquent, si je fais quelque chose comme ceci:

cell.text = @""; // create the label
UILabel* label = (UILabel*)[[cell.contentView subviews] objectAtIndex:0];

alors je reçois une étiquette valide, mais régler numberOfLines sur cela (et lineBreakMode) ne fonctionne pas - je reçois toujours un texte d'une seule ligne. La UILabel contient beaucoup de hauteur pour le texte à afficher. Je renvoie simplement une valeur élevée pour la hauteur dans heightForRowAtIndexPath.

150
Airsource Ltd

Voici un moyen plus simple, et cela fonctionne pour moi:

Dans votre fonction cellForRowAtIndexPath:. La première fois que vous créez votre cellule:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

Vous remarquerez que je règle le nombre de lignes de l'étiquette sur 0. Cela lui permet d'utiliser autant de lignes que nécessaire.

La partie suivante consiste à spécifier la taille de votre UITableViewCell; procédez ainsi dans votre fonction heightForRowAtIndexPath:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];
    CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
    CGSize labelSize = [cellText sizeWithFont:cellFont constrainedToSize:constraintSize lineBreakMode:UILineBreakModeWordWrap];

    return labelSize.height + 20;
}

J'ai ajouté 20 à la hauteur de ma cellule renvoyée car j'aime bien mettre un peu de mémoire tampon autour de mon texte.

273
Tim Rupe

Mise à jour de la réponse de Tim Rupe pour iOS7:

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] ;
    cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:17.0];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellText = @"Go get some text for your cell.";
    UIFont *cellFont = [UIFont fontWithName:@"Helvetica" size:17.0];

    NSAttributedString *attributedText =
        [[NSAttributedString alloc]
            initWithString:cellText
            attributes:@
            {
                NSFontAttributeName: cellFont
            }];
    CGRect rect = [attributedText boundingRectWithSize:CGSizeMake(tableView.bounds.size.width, CGFLOAT_MAX)
                                               options:NSStringDrawingUsesLineFragmentOrigin
                                               context:nil];
    return rect.size.height + 20;
}
15
ddiego

Un bref commentaire/réponse pour enregistrer mon expérience lorsque j'ai eu le même problème. Malgré l'utilisation des exemples de code, la hauteur de la cellule sous forme de tableau était en train de s'ajuster, mais l'étiquette à l'intérieur de la cellule ne s'ajustait toujours pas correctement - la solution était que je chargeais ma cellule à partir d'un fichier NIB personnalisé, ce qui arrive après la hauteur de la cellule en ajusté.

Et j'avais mes paramètres dans le fichier NIB pour ne pas envelopper le texte, et n'avoir qu'une seule ligne pour l'étiquette; les paramètres du fichier NIB remplaçaient ceux que j’avais réglés dans le code.

La leçon que j'ai prise était de veiller à toujours garder à l'esprit l'état des objets à chaque instant - ils n'ont peut-être pas encore été créés! ... Quelqu'un au bout de la ligne.

3
Richard Le Mesurier

Si nous n’ajoutons que du texte dans la cellule UITableView, nous n’avons besoin que de deux délégués (pas besoin d’ajouter UILabels supplémentaire)

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Cette solution a fonctionné pour moi: -

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.font = [UIFont fontWithName:@"Helvetica" size:16];
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;

    [cell setSelectionStyle:UITableViewCellSelectionStyleGray]; 
    cell.textLabel.text = [mutArr objectAtIndex:indexPath.section];
    NSLog(@"%@",cell.textLabel.text);

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png" ]];

    return cell;

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{  
    CGSize labelSize = CGSizeMake(200.0, 20.0);

    NSString *strTemp = [mutArr objectAtIndex:indexPath.section];

    if ([strTemp length] > 0)
        labelSize = [strTemp sizeWithFont: [UIFont boldSystemFontOfSize: 14.0] constrainedToSize: CGSizeMake(labelSize.width, 1000) lineBreakMode: UILineBreakModeWordWrap];

    return (labelSize.height + 10);
}

Ici, la chaîne mutArr est un tableau mutable à partir duquel je récupère mes données. 

EDIT: - Voici le tableau que j'ai pris.

mutArr= [[NSMutableArray alloc] init];

[mutArr addObject:@"HEMAN"];
[mutArr addObject:@"SUPERMAN"];
[mutArr addObject:@"Is SUPERMAN powerful than HEMAN"];
[mutArr addObject:@"Well, if HEMAN is weaker than SUPERMAN, both are friends and we will never get to know who is more powerful than whom because they will never have a fight among them"];
[mutArr addObject:@"Where are BATMAN and SPIDERMAN"];
2
Arshad Parwez

Maintenant, les vues de table peuvent avoir des cellules à taille automatique. Définissez la vue de la table comme suit

tableView.estimatedRowHeight = 85.0 //use an appropriate estimate tableView.rowHeight = UITableViewAutomaticDimension

Apple Reference

1
Jason

J'ai trouvé cela assez simple et direct: 

[self.tableView setRowHeight:whatEvereight.0f];

par exemple :

[self.tableView setRowHeight:80.0f];

Cela peut ou peut ne pas être la meilleure approche/standard pour le faire, mais cela a fonctionné dans mon cas

0
Manish Kr. Shukla

Essayez mon code dans Swift. Ce code fonctionnera également pour les étiquettes UIL normales.

extension UILabel {
    func lblFunction() {
        //You can pass here all UILabel properties like Font, colour etc....
        numberOfLines = 0
        lineBreakMode = .byWordWrapping//If you want Word wraping
        lineBreakMode = .byCharWrapping//If you want character wraping
    }
}

Maintenant, appelez simplement comme ça

cell.textLabel.lblFunction()//Replace your label name 
0
iOS

J'utilise les solutions suivantes.

Les données sont fournies séparément dans un membre:

-(NSString *)getHeaderData:(int)theSection {
    ...
    return rowText;
}

Le traitement peut être facilement effectué dans cellForRowAtIndexPath. Définissez la cellule/définissez la police et attribuez ces valeurs au résultat "cellule" . Notez que la numberoflines est définie sur "0", ce qui signifie que vous devez prendre .

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

    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    cell.textLabel.text= [self getRowData:indexPath.section];
    cell.textLabel.font = cellFont;
    cell.textLabel.numberOfLines=0;
    return cell;
}

Dans heightForRowAtIndexPath, je calcule les hauteurs du texte enveloppé . La taille de l'encodage doit correspondre à la largeur de votre cellule. Pour iPad, il s'agit de 1024 . Pour iPhone et iPod 320.

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UIFont *cellFont = [UIFont fontWithName:@"Verdana" size:12.0];
    CGSize boundingSize = CGSizeMake(1024, CGFLOAT_MAX);
    CGSize requiredSize = [[self getRowData:indexPath.section] sizeWithFont:cellFont constrainedToSize:boundingSize lineBreakMode:UILineBreakModeWordWrap];
    return requiredSize.height;    
}
0
Vincent