2011-12-19 117 views
1

我有以下設置:UITableView與自定義UITableViewCell實現。在每個單元格中我都有一個UILabel和一個UIButton。當表格第一次顯示時,在每個單元格中,UILabel的行數設置爲1,所有單元格都有固定的高度(在我的情況下爲60 px)。當單元格中的按鈕被輕敲時,UILabel的行數被設置爲0並且自動換行打開,從而有效地擴展表格單元格。UITableView - 細胞本身控制動態細胞高度

現在,問題是隻有UITableViewCell的實現知道標籤是否展開 - 因此單元高度應該是多少。但是,所有者文件是表的數據源。

我無法得到如何設置這個。任何想法都表示讚賞。這裏

更新是從我的代碼

提取物在自定義的UITableViewCell實現:

- (float)requiredHeight 
{ 
    if(isFull) 
    { 
     CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font] 
            constrainedToSize: CGSizeMake(300.0f, 300.0f) 
             lineBreakMode: UILineBreakModeTailTruncation]; 
     return 42.0f + labelSize.height; 
    } 
    else 
    { 
     return 60.0f; 
    } 
} 

在所有者文件(的UITableViewDelegate):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    OOCommentCell *cell = (OOCommentCell*)[tableView cellForRowAtIndexPath:indexPath]; 
    return [cell requiredHeight]; 
} 

但是這個隨機產生的無限循環或在BAD_ACCESS_EXCEPTION中。

回答

2

OK,有些掙扎之後,這是我結束了,哪種作品。

  1. 我創建了一個簡單的類包含與一個小區的信息:
@interface CommentInfo : NSObject 
{ 
    int ID; 
    NSString *Name; 
    NSString *Date; 
    NSString *Content; 
    BOOL IsFull; 
    float Height; 
} 

@property (readonly) int ID; 
@property (readonly) NSString *Name; 
@property (readonly) NSString *Date; 
@property (readonly) NSString *Content; 
@property (readwrite, assign) float Height; 
@property (readwrite, assign) BOOL IsFull; 

- (id)initWithID:(int)_id withName:(NSString *)_name withDate:(NSString *)_date withText:(NSString *)_text; 

@end 

不要太擔心所有的屬性 - 其中最重要的是Height

  1. 以我控制器(這也是表視圖委託),I數據作爲指針的NSMutableArray保持到CommentInfo類型的對象。

  2. cellForRowAtIndexPath我得到相應的指針並將它傳遞給構造過程中的自定義單元實現,在那裏存儲它。我還將self設置爲該單元的代表。

  3. 在自定義單元實現中,當我需要展開/更改高度時,我更新CommentInfo對象中的Height屬性,並調用委託中的方法來更新顯示。

  4. 當此updateDisplay方法被調用時,我簡單的做到以下幾點:

[CommentsTable beginUpdates]; 
[CommentsTable endUpdates]; 
  1. heightForRowAtIndexPath方法,檢索到相應的指針CommentInfo和讀取Height財產。由於控制器和單元格之間的指針相同,因此對這個屬性的任何更改都將在兩個類中都可見。

工作完成。

+0

我在UITableViewCell裏面使用了一個UIWebView,因此在調用heightForRowAtIndexPath時它不能告訴高度。 我所做的是將單元格設置爲UIWebView的代理,並在webViewDidFinishLoad方法中調用[webView sizeToFit]; webView.hidden = NO; [tableViewController setRowHeight:webView.bounds.size.height forRowId:id];並在UITableViewController的setRowHeight方法中,我調用了你提供的這兩個方法:[tableView beginUpdates]; [tableView endUpdates];它的工作原理。 – asdfasdfads 2014-01-11 20:40:42

0

在您的表代表中實施方法UITableViewDelegate – tableView:heightForRowAtIndexPath:。如果你想在每個單元格的基礎上定義高度,你可以通過在tableView:heightForRowAtIndexPath中調用你自己的tableView:cellForRowAtIndexPath:方法來將這個調用「轉發」到單元的類。

更新:在代碼中實現。該錯誤是由委託調用tableView中的方法簽名不正確引起的:cellForRowAtIndexPath。

在自定義的UITableViewCell實現:

- (CGFloat)requiredHeight 
{ 
    if(isFull) 
    { 
     CGSize labelSize = [LblTitle.text sizeWithFont: [LblContent font] 
            constrainedToSize: CGSizeMake(300.0f, 300.0f) 
             lineBreakMode: UILineBreakModeTailTruncation]; 
     return 42.0f + labelSize.height; 
    } 
    else 
    { 
     return 60.0f; 
    } 
} 

在所有者文件(的UITableViewDelegate):

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    OOCommentCell *cell = (OOCommentCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    return [cell requiredHeight]; 
} 
+0

我不認爲我遵循你的邏輯。我已經定義了'heightForRowAtIndexPath',其中我試圖在indexpath處獲取單元格,然後調用其中的方法來返回所需的路徑,但是這會導致bad_access_exception。 – 2011-12-19 22:47:15

+0

本質上,該表詢問UITableViewDelegate,「行X應該多高?」通過方法tableView:heightForRowAtIndexPath :.您應該以像素爲單位返回所需高度的CGFloat,而不是索引路徑。 – 2011-12-19 23:02:12

+0

@JacobJinnings:你似乎誤解了我的代碼。爲了「排X應該有多高」,我試圖得到X排,並詢問它應該有多高 - 並返回該值。請仔細閱讀代碼。 – 2011-12-19 23:08:11