Wie kann ich Text in eine UITableViewCell ohne benutzerdefinierte Zelle einschließen?


151

Dies ist auf dem iPhone 0S 2.0. Die Antworten für 2.1 sind ebenfalls in Ordnung, obwohl mir keine Unterschiede in Bezug auf Tabellen bekannt sind.

Es scheint möglich zu sein, Text zum Umbrechen zu bringen, ohne eine benutzerdefinierte Zelle zu erstellen, da a standardmäßig eine UITableViewCellenthält UILabel. Ich weiß, dass ich es zum Laufen bringen kann, wenn ich eine benutzerdefinierte Zelle erstelle, aber das versuche ich nicht zu erreichen - ich möchte verstehen, warum mein aktueller Ansatz nicht funktioniert.

Ich habe herausgefunden, dass das Etikett bei Bedarf erstellt wird (da die Zelle den Zugriff auf Text und Bilder unterstützt und die Datenansicht erst bei Bedarf erstellt wird). Wenn ich also Folgendes mache:

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

dann bekomme ich eine gültige Beschriftung, aber die Einstellung numberOfLinesauf diese (und lineBreakMode) funktioniert nicht - ich bekomme immer noch einzeiligen Text. Es gibt viel Höhe in der, UILabeldamit der Text angezeigt wird - ich gebe nur einen großen Wert für die Höhe in zurück heightForRowAtIndexPath.

Antworten:


277

Hier ist ein einfacher Weg, und es funktioniert für mich:

Innerhalb Ihrer cellForRowAtIndexPath:Funktion. Das erste Mal, wenn Sie Ihre Zelle erstellen:

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];
}

Sie werden feststellen, dass ich die Anzahl der Zeilen für das Etikett auf 0 gesetzt habe. Dadurch kann es so viele Zeilen verwenden, wie es benötigt.

Der nächste Teil besteht darin, anzugeben, wie groß Ihr UITableViewCellWille sein wird. Tun Sie dies in Ihrer heightForRowAtIndexPathFunktion:

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

Ich habe meiner zurückgegebenen Zellenhöhe 20 hinzugefügt, weil ich einen kleinen Puffer um meinen Text mag.


17
Sie müssen Ihre cell.textLabel.numberOfLines nicht auf eine beliebig hohe Zahl setzen. Das Setzen auf 0 bedeutet "so viele Zeilen, wie zur Anzeige erforderlich sind".
mmc

Danke, ich werde meinen Beitrag heute Abend bearbeiten, nachdem ich die Möglichkeit habe, ihn in meinem eigenen Projekt zu überprüfen.
Tim Rupe

1
Das Setzen der Anzahl der Zeilen auf 0 funktioniert
einwandfrei

1
cagreen: Es stellt sich heraus, dass ich dies replizieren kann, aber nur, wenn ich das iPhone OS 3.0 im Simulator verwende. Wenn ich 3.1+ verwende, stimmt die Größenänderung von detailTextLabel mit der von sizeWithFont überein. Tims Methode funktioniert also sehr gut - nur für 3.1+ (wahrscheinlich aufgrund eines Fehlers / einer Fehlfunktion beim Standard-Zellen-Rendering 3.0). Für die Aufzeichnung verwende ich einen vertikalen oberen / unteren Rand von 12 (jeweils), eine detaillierte Textbeschriftungsgröße von (188,0, CGFLOAT_MAX) und eine fettgedruckte Systemgröße von 15
Joe D'Andrea

17
UILineBreakModeWordWrap ist in iOS 6 veraltet. Verwenden Sie stattdessen NSLineBreakByWordWrapping.
Ethan Allen

16

Die Antwort von Tim Rupe für iOS7 wurde aktualisiert:

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

3

Ein kurzer Kommentar / eine kurze Antwort, um meine Erfahrungen aufzuzeichnen, als ich das gleiche Problem hatte. Trotz der Verwendung der Codebeispiele wurde die Zellenhöhe in der Tabellenansicht angepasst , aber die Beschriftung in der Zelle wurde immer noch nicht richtig angepasst. Die Lösung bestand darin, dass ich meine Zelle aus einer benutzerdefinierten NIB-Datei lud, was passiert, nachdem die Zellenhöhe angepasst wurde.

Und ich hatte meine Einstellungen in der NIB-Datei so, dass kein Text umbrochen wird und nur eine Zeile für das Etikett vorhanden ist. Die Einstellungen der NIB-Datei haben die Einstellungen überschrieben, die ich im Code angepasst habe.

Die Lektion, die ich nahm, bestand darin, immer zu berücksichtigen, wie der Zustand der Objekte zu jedem Zeitpunkt ist - sie wurden möglicherweise noch nicht erstellt! ... mit jemandem auf der ganzen Linie.


2

Wenn wir nur Text in die UITableViewZelle einfügen möchten, benötigen wir nur zwei Delegaten, mit denen wir arbeiten können (es ist nicht erforderlich, zusätzliche hinzuzufügen UILabels).

1) cellForRowAtIndexPath

2) heightForRowAtIndexPath

Diese Lösung hat bei mir funktioniert:

-(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);
}

Hier ist der String mutArrein veränderbares Array, von dem ich meine Daten erhalte.

EDIT: - Hier ist das Array, das ich genommen habe.

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

Jetzt können die Tabellenansichten Zellen mit Selbstgröße haben. Richten Sie die Tabellenansicht wie folgt ein

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

Apple Referenz


0

Ich benutze die folgenden Lösungen.

Die Daten werden separat in einem Mitglied bereitgestellt:

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

Die Handhabung kann problemlos in erfolgen cellForRowAtIndexPath. Definieren Sie die Zelle / definieren Sie die Schriftart und weisen Sie diese Werte dem Ergebnis "Zelle" zu. Beachten Sie, dass der numberoflinesWert auf "0" gesetzt ist, was bedeutet, dass Sie das nehmen, was benötigt wird.

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

In heightForRowAtIndexPathberechne ich die Höhe des umbrochenen Textes. Die Größe des Bodes hängt von der Breite Ihrer Zelle ab. Für das iPad ist dies 1024. Für das iPhone und den 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

Ich fand das ziemlich einfach und direkt.

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

für zB:

[self.tableView setRowHeight:80.0f];

Dies mag der beste / Standardansatz sein oder auch nicht, aber es hat in meinem Fall funktioniert.


Soweit ich weiß, legt die Eigenschaft rowHeight eine feste Höhe fest, die für alle Zellen in der Tabellenansicht verwendet wird. Die Verwendung von rowHeight ist für die Leistung in großen Tabellen besser. Wenn jedoch die Höhe jeder Zelle je nach Inhalt variieren muss, muss die Methode tableView: heightForRowAtIndexPath: verwendet werden.
jk7

0

Probieren Sie meinen Code schnell aus. Dieser Code funktioniert auch für normale UILabels.

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

Rufen Sie jetzt einfach so an

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

-1

Ich denke, das ist eine bessere und kürzere Lösung. Formatieren Sie einfach das UILabel( textLabel) der Zelle, um die Höhe automatisch durch Angabe zu berechnen, sizeToFitund alles sollte in Ordnung sein.

- (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];
    }

    // Configure the cell...
    cell.textLabel.text = @"Whatever text you want to put here is ok";
    cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
    cell.textLabel.numberOfLines = 0;
    [cell.textLabel sizeToFit];

    return cell;
}

-2

Ich glaube nicht, dass Sie eine UITableViewCell'sprivate Basis manipulieren können UILabel, um dies zu tun. Sie können UILabelder Zelle selbst eine neue hinzufügen und numberOfLinesmit verwenden, sizeToFitum die Größe entsprechend anzupassen. Etwas wie:

UILabel* label = [[UILabel alloc] initWithFrame:cell.frame];
label.numberOfLines = <...an appriate number of lines...>
label.text = <...your text...>
[label sizeToFit];
[cell addSubview:label];
[label release];
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.