2014-09-02 16 views
34

Ich versuche, die Höhe jeder Zeile in den tableView auf die Höhe der entsprechenden Zelle mit diesem Code zu setzen:swift UITableView Satz rowHeight

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

ich diesen Fehler erhalten, wenn var cell Initialisierung:

Gewinde 1: EXC_BAD_ACCESS (code = 2, Adresse = 0x306d2c)

+1

möglich Duplikat von [ EXC \ _BAD \ _ACCESS in heightForRowAtIndexPath iOS] (http://stackoverflow.com/questions/12652761/exc-bad-access-in-heightforrowatindexpath-ios) –

+2

Sie dürfen 'cellForRowAtIndexPath' nicht innerhalb von' heightForRowAtIndexPath' aufrufen. Das EXC_BAD_ACCESS wird durch einen Stapelüberlauf verursacht, der von tiefer Rekursion verursacht wird. –

+0

Woher soll ich CellForRowAtIndexPath aufrufen? –

Antwort

40

die Standard-Put rowHeight in viewDidLoad oder awakeFromNib. Wie von Martin R. wies darauf hin, können Sie als darauf rufen in den Kommentaren nicht cellForRowAtIndexPath von heightForRowAtIndexPath

self.tableView.rowHeight = 44.0 
6

aus, Sie nicht cellForRowAtIndexPath innerhalb heightForRowAtIndexPath aufrufen können.

Sie können eine Vorlagezelle erstellen, die zum Füllen Ihrer Daten verwendet wird, und dann ihre Höhe berechnen. Diese Zelle ist nicht am Tabellenrendering beteiligt und kann zur Berechnung der Höhe jeder Tabellenzelle wiederverwendet werden.

Kurz gesagt, es besteht aus Konfigurieren der Vorlage Zelle mit den Daten, die Sie anzeigen möchten, Größe entsprechend dem Inhalt ändern, und lesen Sie dann seine Höhe.

ich diesen Code aus einem Projekt arbeite ich an genommen habe - leider ist es in Objective C, ich glaube nicht, dass Sie Probleme übersetzen zu schnelle

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

Dies funktioniert, erzeugt jedoch viele Constraint-Fehler beim Scrollen. –

+0

Das ist in meinem Fall nicht passiert, und ich habe das automatische Layout verwendet. – Antonio

+0

@Antonio Könnten Sie bitte helfen, wie dies in Swift übersetzt werden kann? [Hier] (https://gist.github.com/floydpink/363aac55024f5c1b8650) ist was ich versucht habe, aber habe falsche Ergebnisse erhalten. –

80

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

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 
} 

Ansonsten können Sie die Zeilenhöhe eingestellt werden:

self.tableView.rowHeight = 44.0 

In ViewDidLoad.

+1

Wenn Sie Swift 3.0 verwenden, müssen Sie diese Funktion verwenden: 'func tableView (_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat ' – DoK

+0

Danke bearbeitet die Antwort – Nagarjun

+0

Hi Nur versucht, diese Funktion und Xcode 9 beta 6 vorgeschlagene Überschreibung zu verwenden, damit die korrekte Signatur überschreiben func tableView (_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat –

6
yourTableView.rowHeight = UITableViewAutomaticDimension 

Versuchen Sie es.

+0

Perfekt !! Arbeitete für mich. – Manali

2
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
      var height:CGFloat = CGFloat() 
      if indexPath.row == 1 { 
       height = 150 
      } 
      else { 
       height = 50 
      } 

      return height 
     } 
0

try Code wie diese kopieren und einfügen in der Klasse

func Tableview (_ Tableview: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return 100 }

+0

Wie verbessert dies die Antworten auf die Antworten? Sieht wie eine Kopie für mich aus –

Verwandte Themen