2011-12-19 18 views
1

私は以下のセットアップを持っています:カスタムUITableViewCellの実装を持つUITableView。各セルには、UILabelとUIButtonがあります。表が最初に表示されるとき、各セルでUILabelの行数は1に設定され、すべてのセルの高さは固定されています(私の場合は60ピクセル)。セル内のボタンがタップされると、UILabelの行数は0に設定され、ワー​​ドラップがオンになり、効果的に表のセルが展開されます。UITableView - セル自体によって制御される動的セルの高さ

UITableViewCellの実装では、ラベルが展開されているかどうか、つまりセルの高さを知ることができるという問題があります。ただし、所有者ファイルはテーブルのデータソースです。

これを設定する方法については頭がいっぱいです。任意のアイデアが評価されます。しかし、これは中にランダムになり

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

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

更新は、ここでは、カスタムUITableViewCellの実装では私のコード

から抽出されています無限ループまたはBAD_ACCESS_EXCEPTION

答えて

2

OK、いくつかの苦労の後、ここでは作品のどのようなもの、私がなってしまったものです。

  1. 私は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型CommentInfoのオブジェクトへのポインタのNSMutableArrayとしてデータを保持します。

  2. cellForRowAtIndexPath私は対応するポインタを取得し、それが格納されている構築中にカスタムセルの実装に渡します。また、セルへのデリゲートとしてselfを設定しました。

  3. 高さを拡大/変更する必要がある場合、CommentInfoオブジェクトのHeightプロパティを更新し、デリゲートのメソッドを呼び出して表示を更新します。このupdateDisplayメソッドが呼び出される

  4. 、私はシンプル次の操作を行います。

[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メソッドでは、私が用意した2つのメソッドを呼び出します。[tableView beginUpdates]; [tableView endUpdates];それは動作します。 – asdfasdfads

0

テーブル代理人にUITableViewDelegate – tableView:heightForRowAtIndexPath:メソッドを実装します。セルごとに高さを定義する場合は、tableView:heightForRowAtIndexPathの独自のtableView:cellForRowAtIndexPath:メソッドを呼び出すことで、この呼び出しをセルのクラスに '転送'できます。

更新:コードで実装されています。このエラーは、tableView:cellForRowAtIndexPathを呼び出すデリゲートの不正なメソッドシグネチャによって発生しています。カスタムUITableViewCellの実装で

:所有者ファイル(UITableViewDelegate)で

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

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

私はあなたのロジックに従っているとは思わない。私は 'heightForRowAtIndexPath'を定義しました。その中でindexpathでセルを取得し、その中でメソッドを呼び出して必要なパスを返そうとしましたが、bad_access_exceptionになります。 –

+0

本質的に、テーブルはUITableViewDelegateに "Xの高さはどのくらいですか?"と尋ねています。メソッドtableView:heightForRowAtIndexPath:を介してインデックスパスではなく、ピクセル単位で目的の高さのCGFloatを返す必要があります。 –

+0

@JacobJinnings:あなたは私のコードを誤解しているようです。 「行Xの高さはどのくらいですか」には、その行Xを取得し、それがどれくらいの大きさであるべきか尋ねて、その値を返すようにしています。より慎重にコードを見てください。 –