2014-09-02 51 views
34

我想每一行中tableView高度設置爲相應的細胞與此代碼高度:迅速的UITableView組的rowHeight

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

我得到這個錯誤初始化時var cell

線程1:EXC_BAD_ACCESS(代碼= 2,地址= 0x306d2c)

+1

可能重複[ EXC \ _BAD \ _ACCESS in heightForRowAtIndexPath iOS](http://stackoverflow.com/questions/12652761/exc-bad-access-in-heightforrowatindexpath-ios) – 2014-09-02 21:18:30

+2

您不能從'heightForRowAtIndexPath'內調用'cellForRowAtIndexPath'。 EXC_BAD_ACCESS是由深遞歸引起的堆棧溢出引起的。 – 2014-09-02 21:19:18

+0

我應該從哪裏調用CellForRowAtIndexPath? – 2014-09-02 21:23:57

回答

40

把默認rowHeightviewDidLoadawakeFromNib。正如馬丁·R.指出,你不能從heightForRowAtIndexPath

self.tableView.rowHeight = 44.0 
6

cellForRowAtIndexPath正如評論指出的那樣,你不能叫cellForRowAtIndexPathheightForRowAtIndexPath

你可以做的是創建一個模板單元格,用於填充數據,然後計算其高度。 該單元格不參與表格渲染,並且可以重複使用它來計算每個表格單元格的高度。

簡而言之,它包括配置模板單元格與要顯示的數據,使其根據內容調整大小,然後讀取其高度。

我採取這種代碼從一個項目我工作的 - 不幸的是它在目標C,我不認爲你會出現問題翻譯成迅速

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

這可行,但在滾動時會產生很多約束錯誤。 – 2014-11-06 12:52:36

+0

這並沒有發生在我的情況,我用autolayout。 – Antonio 2014-11-06 13:25:48

+0

@Antonio你能幫忙解釋一下如何將它轉換成Swift嗎? [這裏](https://gist.github.com/floydpink/363aac55024f5c1b8650)是我試過的,但一直得到不正確的結果。 – 2014-12-17 05:03:10

80

有關設置行的高度有不同的方法:

對於夫特3

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

舊版夫特使用

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

否則,您可以使用設置行高度:

self.tableView.rowHeight = 44.0 

viewDidLoad中

+1

如果您使用的是Swift 3.0,您必須使用以下func: 'func tableView(_ tableView:UITableView,heightForRowAt indexPath:IndexPath) - > CGFloat ' – DoK 2016-09-30 11:02:51

+0

謝謝編輯答案 – Nagarjun 2016-09-30 12:10:35

+0

嗨只是試圖使用這個函數和Xcode 9測試版6建議重寫,所以正確的簽名是重寫func tableView(_ tableView:UITableView,heightForRowAt indexPath:IndexPath) - > CGFloat – 2017-09-11 07:02:44

6
yourTableView.rowHeight = UITableViewAutomaticDimension 

試試這個。這樣的複製

+0

完美!爲我工作。 – Manali 2016-03-30 06:29:35

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代碼,並在課堂上粘貼

FUNC的tableView(_的tableView:UITableView的,heightForRowAt indexPath:IndexPath) - > CGFloat的{ 回報100 }

+0

這是如何改善upvoted的答案?看起來像我的副本 – 2018-01-10 16:06:38