2015-10-20 92 views
1

我在我的應用程序中創建了自定義單元格。我想要獲取HeightForRowAtIndexPath中的每個單元格。請告訴我如何在此方法中獲得自定義單元格。我試過這段代碼,但這會導致無限循環&終於會崩潰應用程序。如何在heightForRowAtIndexPath中獲取單元格?

HomeCell *cell=(HomeCell *)[tableView cellForRowAtIndexPath:indexPath]; 

編輯:

我曾經試過,但它給了我細胞高度爲零。

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *cellIdentifier = @"HomeCell"; 
    HomeCell *cell = (HomeCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    float tv_view_height=cell.tv_post.frame.size.height; 
    float like_count_height=cell.label_like_count.frame.size.height; 
    float first_comment_height=cell.first_comment.frame.size.height; 
    float second_comment_height=cell.second_cmment.frame.size.height; 
    float third_comment_height=cell.third_comment.frame.size.height; 

    Post *user_post=[arr_post objectAtIndex:indexPath.row]; 
    float comment_count=[user_post.comment_count intValue]; 
    if(comment_count<=0) 
    { 
     first_comment_height=0; 
     second_comment_height=0; 
     third_comment_height=0; 


    } 
    else if(comment_count==1) 
    { 
     second_comment_height=0; 
     third_comment_height=0; 

    } 
    else if(comment_count==2) 
    { 

     third_comment_height=0; 
    } 
    float like_count=[user_post.like_count intValue]; 
    if(like_count<=0) 
    { 

     like_count_height=0; 
    } 
    float total_height=tv_view_height+like_count_height+first_comment_height+second_comment_height+third_comment_height; 
    NSLog(@"total heigh is %f'",total_height); 
    return total_height; 
} 

請告訴哪個是最好的方法?

+0

告訴我你要做什麼? – jigs

+0

在'heightForRowAtIndexPath'裏面使用'dequeueReusableCellWithIdentifier'不是一個好主意。 – 0yeoj

+0

你建議一些更好的plaese。 – Techiee

回答

0

你可以從頭開始創建一個新的電池,只需通過HomeCell *sexyCell = [[HomeCell alloc]init];

或出隊一個像你cellForRowtableView.dequeueWithReuseIdentifier:)一樣。

雖然我建議創建一個從無到有後處置它(設置爲無),因爲如果你出列,它在那裏,他們將在隊列中去,造成重大內存泄漏和許多細胞相同的結束indexPath。

你可以做的是:

  • 創建的alloc初始化細胞
  • 在其視實際數據
  • 使用.layoutsubviews填充它
  • 計算它的大小和應用它到你的真實細胞

你應該怎麼做:

使用自動佈局並添加必需的所有約束,您的所有標籤都將動態調整大小。大約需要3到4個小時才能獲得Auto layout的基礎知識,並且需要大約一個月的時間才能真正掌握它。

我強烈強烈建議您不要使用對象框架調整大小,如果正確使用約束,大多數標籤和視圖都將調整大小,而不必編寫任何代碼。

一旦你這樣做了,因爲你有不同高度的單元格,所以使用了tableview的DynamicHeight屬性和它自帶的輕微調整。你可以找到

A great tutorial here

The same updated tutorial for swift(更多的是最新的,但你需要翻譯)

This amazing StackOverflow answer which you MUST read

+0

我已經試過這個,但是這給了我錯誤的結果。像第四個單元格的圖像顯示在第一個單元格上。 – Techiee

+0

您想要在heightForRow中創建單元格的唯一原因是對高度進行一些計算,例如動畫。如果由於cellForRow:你得到錯誤的數據。除非您使用高度爲FowRow的出列,否則會導致問題。 –

+0

其實只是發佈你的兩種方法(cellforrow和heightforrow),所以我可以看到完整的代碼 –

0

我會建議你採取高度形成對你的viewController配置集合。

像這樣:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

    CGFloat height; 
    CellConfiguration * selectedCellConfiguration =[_cellConfigurations objectAtIndex:indexPath.row]; 

    switch (selectedCellConfiguration.type) { 
     case TheTypeYouNeed: 
      return TheValueYouNeed 
     default: 
      height = 44.0f; 
      break; 
    } 

    return height; 
} 
-2

NSIndexPath * indexPath = [NSIndexPath indexPathForRow:indexpath。row inSection:0];

Custom Cell * cell = [tableview cellForRowAtIndexPath:indexPath];

通過這種方式,您將獲得每個單元在你的方法

+0

這將使無限循環 – Techiee

+0

通過你將能夠獲得每個單元格,那麼你必須返回一個單元格高度。而且你的應用在返回後不會崩潰。 –

+0

它正在崩潰,我第一次嘗試它。 – Techiee

7

如何讓細胞在heightForRowAtIndexPath?

這是不可能的,因爲當調用-heightForRowAtIndexPath時,尚未創建單元格。您需要了解UITableView如何工作的:

  1. 的UITableView詢問它的數據源,將有多少部具有

    -numberOfSectionsInTableView

    在這一點上有沒有產生細胞。

  2. 的UITableView詢問它的數據源的每個部分將有多少行有

    -numberOfRowsInSection

    在這一點上有沒有產生細胞。

  3. 的UITableView讓每個可見行的它的代表高度,知道在哪裏細胞將位於

    -heightForRowAtIndexPath

    在這一點上有沒有產生細胞。

  4. 的UITableView要求它的DataSource給它一個細胞在給定的索引路徑

    -cellForRowAtIndexPath

    顯示在這一點上創建的細胞。

可以從數據模型計算出的每個單元的高度。您不需要單元格 - 您已經知道將包含註釋的框架寬度,您知道它是內容,您知道它是字體,您知道換行模式等。因此,您可以計算高度。例如:

CGFloat commentsHeight = 0; 
Post *user_post = [arr_post objectAtIndex:indexPath.row]; 

for (NSString *comment in user_post.comments) 
{ 
    CGRect commentrect = [comment boundingRectWithSize:CGSizeMake(self.view.bounds.size.width - 18, FLT_MAX) 
              options:(NSStringDrawingUsesLineFragmentOrigin) 
             attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:15]} 
              context:nil]; 
    commentsHeight += commentrect.size.height; 
} 

而且您可以從其數據模型中計算單元其他組件的高度。

但現在,在2015年,這不是最好的方法。你真的會更好閱讀教程,其中顯示@Zil,與Autolayout

1

你應該聲明一個數組存儲的TableView細胞的cellForRowAtIndexPath,您可以在heightForRowAtIndexPath使用存儲單元。讓我們嘗試使用這個。

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

    HomeCell *cell = (HomeCell *)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) { 
      cell = [[[HomeCell alloc] init] autorelease]; 
    } 

    // Store table view cells in an array 
    if (![tableViewCells containsObject:cell]) { 
      [tableViewCells addObject:cell]; 
    } 

    return cell; 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if([tableViewCellsArray objectAtIndex:indexPath.row]) { 
      HomeCell *cell = (HomeCell *)[tableViewCells objectAtIndex:indexPath.row]; 
      // Process your Code 
    } 

    return yourCalculatedCellHeight; 
} 
相關問題