89

カスタム UITableViewCells を設計し、http://forums.macrumors.com/showthread.php?t=545061 にあるスレッドで説明されている手法を使用して問題なくロードできます。ただし、そのメソッドを使用すると、reuseIdentifier でセルを初期化できなくなります。つまり、呼び出しごとに各セルのまったく新しいインスタンスを作成する必要があります。再利用のために特定のセル型をキャッシュし、Interface Builder でそれらを設計できる良い方法を見つけた人はいますか?

4

16 に答える 16

119

実際には、Interface Builder でセルを作成しているので、そこで再利用識別子を設定するだけです。

IB_reuse_identifier

または、Xcode 4 を実行している場合は、[属性インスペクター] タブを確認します。

ここに画像の説明を入力

(編集: XIB が XCode によって生成された後、空の UIView が含まれますが、UITableViewCell が必要です。そのため、手動で UIView を削除し、Table View Cell を挿入する必要があります。もちろん、IB は UITableViewCell パラメーターを表示しません。 UIView.)

于 2009-04-18T23:08:45.933 に答える
74

適切なメソッド シグネチャを使用してメソッドを実装するだけです。

- (NSString *) reuseIdentifier {
  return @"myIdentifier";
}
于 2009-01-05T18:21:49.780 に答える
66

現在、iOS 5 には、そのための適切な UITableView メソッドがあります。

- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier
于 2012-04-10T11:45:52.383 に答える
47

このコードを最初に見つけた場所を思い出せませんが、これまでのところうまく機能しています。

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomTableCell";
    static NSString *CellNib = @"CustomTableCellView";

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CellNib owner:self options:nil];
        cell = (UITableViewCell *)[nib objectAtIndex:0];
    }

    // perform additional custom work...

    return cell;
}

Interface Builder のセットアップ例...

代替テキスト

于 2009-07-19T02:05:27.033 に答える
12

私がこの質問に与えた答えを見てください:

Interface Builder で NSCell サブクラスを設計することは可能ですか?

IB で UITableViewCell を設計できるだけでなく、複数の要素を手作業で配線したり配置したりするのが非常に面倒なため、望ましいことです。可能な限りすべての要素を不透明にするように注意している限り、パフォーマンスは問題ありません。reuseID は、UITableViewCell のプロパティの IB で設定されます。次に、デキューを試みるときに、一致する再利用 ID をコードで使用します。

また、昨年の WWDC のプレゼンターの何人かから、IB でテーブル ビュー セルを作成するべきではないと聞いていましたが、それは二段ベッドの負荷です。

于 2009-01-05T20:42:28.233 に答える
7

4.0頃のiOSの時点で、iOSドキュメントには、これを超高速で動作させるための特定の手順があります。

http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/TableView_iPhone/TableViewCells/TableViewCells.html#//apple_ref/doc/uid/TP40007451-CH7

UITableViewCellのサブクラス化について説明しているところまで下にスクロールします。

于 2011-01-17T21:31:21.210 に答える
2

同様の方法でカスタム ビュー セルを作成しますが、IBOutlet を介してセルを接続します。

この[nib objectAt...]アプローチは、配列内の項目の位置の変更の影響を受けやすくなっています。

アプローチは良いです-試してみたUIViewControllerだけで、十分にうまく機能します。

しかし...

いずれの場合も、initWithStyleコンストラクターは呼び出されないため、デフォルトの初期化は行われません。

initWithCoderorの使用に関するさまざまな場所を読みawakeFromNibましたが、これらのいずれかが正しい方法であるという決定的な証拠はありません。

メソッドで初期化メソッドを明示的に呼び出すことを除けば、cellForRowAtIndexPathこれに対する答えはまだ見つかりません。

于 2010-01-22T11:31:42.900 に答える
2

ルイス法は私のために働いた。これは、ペン先から UITableViewCell を作成するために使用するコードです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellId"];

    if (cell == nil) 
    {
        UIViewController *c = [[UIViewController alloc] initWithNibName:@"CustomCell" bundle:nil];
        cell = (PostCell *)c.view;
        [c release];
    }

    return cell;
}
于 2009-02-10T12:51:23.760 に答える
2

この手法も機能し、ビュー コントローラーでメモリ管理のためにファンキーな ivar を必要としません。ここで、カスタム テーブル ビュー セルは、「CustomCell.xib」という名前の xib に存在します。

 static NSData *sLoadedCustomCell = nil;

 cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCell"];
 if (cell == nil) 
 {
   if (sLoadedCustomCell == nil) 
   {        
      // Load the custom table cell xib
      // and extract a reference to the cell object returned
      // and cache it in a static to avoid reloading the nib again.

      for (id loadedObject in [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:nil options:nil]) 
      {
        if ([loadedObject isKindOfClass:[UITableViewCell class]]) 
        {
          sLoadedCustomCell = [[NSKeyedArchiver archivedDataWithRootObject: loadedObject] retain];
          break;
        }
    }
    cell = (UITableViewCell *)[NSKeyedUnarchiver unarchiveObjectWithData: sLoadedCustomCell];
  }
于 2010-09-29T00:30:36.570 に答える
2
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *simpleTableIdentifier = @"CustomCell";

CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
if (cell == nil)
{
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];

    [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}         

return cell;
}
于 2014-03-01T05:29:41.337 に答える
2

少し前に、 blog.atebits.comでこのトピックに関する素晴らしいブログ投稿を見つけ、それ以来、Loren Brichter ABTableViewCell クラスを使用してすべての UITableViewCells を実行し始めました。

最終的には、すべてのウィジェットを配置する単純なコンテナー UIView になり、スクロールは非常に高速です。

これが役に立つことを願っています。

于 2010-05-27T00:18:53.393 に答える
1

UITableViewのドキュメントからdequeueWithReuseIdentifier:「再利用するセルオブジェクトを識別する文字列。デフォルトでは、再利用可能なセルの識別子はそのクラス名ですが、任意の値に変更できます。」

-reuseIdentiferを自分でオーバーライドするのは危険です。セルサブクラスに2つのサブクラスがあり、これらの両方を1つのテーブルビューで使用するとどうなりますか?彼らが再利用識別子の呼び出しをスーパーに送信すると、間違ったタイプのセルがデキューされます..............再利用識別子メソッドをオーバーライドする必要があると思いますが、置き換えられた識別子を返すようにしますストリング。または、指定されていない場合は、クラスを文字列として返すようにします。

于 2011-11-04T09:24:44.503 に答える
1

gustavogb ソリューションは私にはうまくいきません。私が試したのは次のとおりです。

ChainesController *c = [[ChainesController alloc] initWithNibName:@"ChainesController" bundle:nil];
[[NSBundle mainBundle] loadNibNamed:@"ChaineArticleCell" owner:c options:nil];
cell = [c.blogTableViewCell retain];
[c release];

うまくいくようです。blogTableViewCell はセルの IBOutlet であり、ChainesController はファイルの所有者です。

于 2010-07-08T09:59:58.020 に答える
0

参考までに、私は iPhone Tech Talks の 1 つで、iPhone のエンジニアにこの件について尋ねた。彼の答えは、「はい、IB を使用してセルを作成することは可能です。しかし、しないでください。しないでください」でした。

于 2009-01-05T20:27:41.447 に答える
0

Ben Mosher によってリンクされた Apple の指示に従いました (ありがとう!) が、Apple が重要な点を省略していることに気付きました。彼らが IB で設計するオブジェクトは、そこからロードする変数と同様に、単なる UITableViewCell です。しかし、UITableViewCell のカスタム サブクラスとして実際に設定し、サブクラスのコード ファイルを作成する場合は、IBOutlet 宣言と IBAction メソッドをコードに記述し、IB のカスタム要素に接続できます。次に、ビュー タグを使用してこれらの要素にアクセスする必要はなく、任意の種類のクレイジーなセルを作成できます。ココアタッチ天国です。

于 2011-08-22T21:02:50.733 に答える