web-dev-qa-db-de.com

schnelles UITableView set rowHeight

Ich versuche, die Höhe jeder Zeile in der Variablen tableView auf die Höhe der entsprechenden Zelle mit diesem Code festzulegen:

override func tableView(tableView: UITableView!, heightForRowAtIndexPath indexPath: NSIndexPath!) -> CGFloat {
      var cell = tableView.cellForRowAtIndexPath(indexPath)
      return cell.frame.height
}

Ich erhalte diesen Fehler beim Initialisieren von var cell

Thread 1: EXC_BAD_ACCESS (Code = 2, Adresse = 0x306d2c)

50
tim_yng

Zum Einstellen der Zeilenhöhe gibt es eine separate Methode: 

Für Swift 3

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
    return 100.0;//Choose your custom row height
}

Ältere Swift verwendet

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
{
    return 100.0;//Choose your custom row height
}

Andernfalls können Sie die Zeilenhöhe einstellen mit:

self.tableView.rowHeight = 44.0

In ViewDidLoad .

112
Nagarjun

Setzen Sie die Standardvariable rowHeight in viewDidLoad oder awakeFromNib. Wie von Martin R. erläutert, können Sie cellForRowAtIndexPath nicht von heightForRowAtIndexPath aufrufen.

self.tableView.rowHeight = 44.0
49
Mundi
yourTableView.rowHeight = UITableViewAutomaticDimension

Versuche dies.

9
Prabhav

Wie in Kommentaren dargelegt, können Sie cellForRowAtIndexPath nicht innerhalb von heightForRowAtIndexPath aufrufen. 

Sie können eine Schablonenzelle erstellen, die zum Füllen der Daten verwendet wird, und deren Höhe berechnen. Diese Zelle nimmt nicht an der Tabellenwiedergabe teil und kann zur Berechnung der Höhe jeder Tabellenzelle erneut verwendet werden.

Kurz gesagt, besteht die Konfiguration der Vorlagezelle mit den Daten, die Sie anzeigen möchten, ändern Sie die Größe entsprechend dem Inhalt und lesen Sie dann die Höhe.

Ich habe diesen Code aus einem Projekt übernommen, an dem ich arbeite - leider in Ziel C, ich glaube nicht, dass Sie Probleme haben werden, in Swift zu übersetzen

- (CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    static PostCommentCell *sizingCell = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sizingCell = [self.tblComments dequeueReusableCellWithIdentifier:POST_COMMENT_CELL_IDENTIFIER];
    });

    sizingCell.comment = self.comments[indexPath.row];
    [sizingCell setNeedsLayout];
    [sizingCell layoutIfNeeded];

    CGSize size = [sizingCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return size.height;
}
6
Antonio
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
            var height:CGFloat = CGFloat()
            if indexPath.row == 1 {
                height = 150
            }
            else {
                height = 50
            }

            return height
        }
5

Problem Ursache:
Das Problem ist, dass die Zelle noch nicht erstellt wurde. TableView berechnet zuerst die Höhe für die Zeile und füllt dann die Daten für jede Zeile auf. Daher wurde das Zeilenarray nicht erstellt, wenn die heightForRow-Methode aufgerufen wird. Ihre App versucht also, auf einen Speicherplatz zuzugreifen, für den sie keine Berechtigung hat, und daher erhalten Sie die EXC_BAD_ACCESS-Nachricht. 

So erreichen Sie die Größenänderung von TableViewCell in UITableView:
Legen Sie einfach die richtigen Einschränkungen für Ihre Ansichten in TableViewCell in StoryBoard fest. Denken Sie daran, Sie sollten keine Höhenbeschränkungen für die Stammansicht von TableViewCell festlegen. Die Höhe sollte anhand der Höhe der Unteransichten korrekt berechnet werden können. Dies ist wie bei der Festlegung der richtigen Einschränkungen für UIScrollView. Auf diese Weise erhalten Ihre Zellen je nach ihren Unteransichten unterschiedliche Höhen. Es sind keine zusätzlichen Maßnahmen erforderlich

2
Mehdi

Vergewissern Sie sich, dass Ihr TableView-Delegierter ebenfalls funktioniert. Wenn nicht, dann __ in Ihrem Storyboard oder in .xib Halten Sie die Strg-Taste gedrückt und klicken Sie mit der rechten Maustaste auf tableView, und ziehen Sie sie in Ihren aktuellen ViewController. Swift 2.0

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 60.0;
    }
0
Ameer Chand