7

現在、次のようなカスタム UITableViewCells を含むニュースフィードがあります。

NewsCell.m
NewsCell.xib


NewsCell_Friends.m
NewsCell_Friends.xib
NewsCell_CheckinPhoto.m
NewsCell_CheckinPhoto.xib

[...]

NewsCell_Friends と NewsCell_Checkin は両方とも NewsCell から継承します (すべてのサブクラスで共有される titleLabel、dateLabel などのメソッドと要素)

現時点では、ニュースの種類ごとに非常に異なるレイアウト (Xib) があるため、NewsCell クラス自体は使用せず、サブクラスのみを使用しています。

ここで、ニュースフィードの UI に関して、すべてのセルが同じ外観、同じ高さ、同じコンテンツ (titleLabel と dateLabel) を持つ軽い実装が必要だとしましょう。(実際には通知フィードなど)。

私がやりたいことは、NewsCell.xib をあらゆる種類のニュースのスタンドアロンとして再利用することです。たとえば、以下のようになります。

NewsCell_CheckinPhoto *cell = [tableView dequeueReusableCellWithIdentifier:@"CheckinPhoto"];
    if (!cell){
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"NewsCell" bundle:nil];
        cell = (NewsCell_CheckinPhoto *)c.view;
        cell.parent = self;
    }
    [cell configureCell:indexPath withNews:news];
    return  cell;

cellForRowAtIndexPathデリゲート メソッドで。

このコントローラーでは、NewsCell_CheckinPhoto xib ではなく、NewsCell xib を使用していることに注意してください。

しかし、それは機能していません: nib ファイルは適切にロードされ、NewsCell.xib のコンテンツはセルに適切に表示されますが、NewsCell_CheckinPhoto 内のラベルの構成 (たとえば、titleLabel.text = @"Robert take a photo")クラスは機能しておらず、呼び出されていません。

NewsCell.xib ファイルでクラス タイプ *NewsCell_CheckinPhoto* を指定した場合にのみ機能しますが、NewsCell.xib を再利用して NewsCell の各サブクラスをサンプルと一意の表現でレンダリングすることはできません。

4

1 に答える 1

0

あなたが正しいことを理解したら、XIBからセルをロードしたいと考えています。
あなたはそれを行うべきではありません

UIViewController *c = [[UIViewController alloc] initWithNibName:@"NewsCell" bundle:nil]; ただし、セルのみをXIBに入れてからロードします

UITableViewCell *cell = [[NSBundle mainBundle] loadNibNamed:@"NewsCell"][0];

または同様のもの(ドキュメントを確認してください)。

また、XIB からテーブル ビュー セルのようなものをロードする場合、initWithCoder:、 ではなくinit、で初期化されることに注意してくださいinitWithFrame:。これが、アウトレットが初期化されていない理由である可能性があります。

于 2013-08-23T15:06:02.613 に答える