2012-02-05 3 views
18

XIBを使用してカスタムUITableViewCellを作成したいと思いますが、UITableViewControllerのキューメカニズムを使用してリサイクルする方法がわかりません。どうすればこれを達成できますか?XIBから作成されたUITableViewCellオブジェクトをどのようにリサイクルできますか?

皆さん、この質問は、the FAQとして自己回答となるように意図されていましたが、素晴らしい回答が大好きです。いくつかのアップフォートを持って、ビールを飲む。私は友人が私に尋ねたので、私はこれを尋ねた、私はStackOverflowにそれを載せたいと思った。貢献するものがあれば、是非!

答えて

51

あなたが呼び出すたびその後

[self.tableView registerNib:[UINib nibWithNibName:@"nibname" 
              bundle:nil] 
    forCellReuseIdentifier:@"cellIdentifier"]; 

を使用することができます。

cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"]; 

テーブルビューには、ペン先をロードし、あなたの細胞を与える、またはセルをデキューしますかあなたのために!

ペン先にペンテーブルセルが1つしか付いていないペン先が必要です。

+3

これについて知りませんでした。 – Moshe

+2

これは、iOS5で導入された新しいAPIでした。私はそれを見てからそれを使用していました。 UITableViewCellをサブクラス化し、セル内のさまざまなコントロールを指すIBOutletプロパティを追加することで、さらに進化することもできます。これで、ViewWithTagを使用する必要はありません。 –

+0

絶対に素晴らしいです! – Moshe

2

空のペン先を作成し、最初の項目として表のセルを追加します。インスペクタでは、Interface BuilderでreuseIdentifier文字列を追加できます。

はあなたのコード内のセルを使用するには、次の操作を行います。

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *reuseIdentifier = @"blah"; //should match what you've set in Interface Builder 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[NSBundle mainBundle] loadNibNamed:@"YourTableCellNib" owner:nil options:nil] objectAtIndex:0]; 
    } 

    //set up cell 

    return cell; 
} 

があり、あなたのセルのための出口を作成し、ファイルの所有者としてのコントローラを用いて細胞ペン先をロードする別の方法ですが、正直なところ、このはるかに簡単です。

ペン先のセルに追加したサブビューにアクセスするには、固有のタグを付けて[ce​​ll viewWithTag:x]でアクセスします。

セルでカスタムプロパティを設定できるようにするには、カスタムUITableViewCellサブクラスを作成し、それをInterfaceBuilderのペン先のクラスとして設定し、カスタムサブクラスにUITableViewCellをキャストする必要があります上のコードでデキューします。

あなたが行うことができますどのようにここで
1

の.hで cellLoaderは、次のように定義されて
- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    YourCustomeCell *cell = (YourCustomeCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName]; 
    if (!cell) 
    { 
    NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil]; 
    cell = [topLevelItems objectAtIndex:0]; 
    } 

    return cell; 
} 

:(初期化中に例えば)以下のように

UINib *cellLoader; 

との.mにはistantiatedされています

cellLoader = [[UINib nibWithNibName:CellClassName bundle:[NSBundle mainBundle]] retain]; 

およびCellClassNameは、次のように.mで定義されます(als oあなたのxibの名前)。

static NSString *CellClassName = @"YourCustomeCell"; 

は、細胞を作成し、あなたのXIBでも文字列 CellClassNameを使用することを忘れないでください。

詳細については、この素晴らしいチュートリアルcreating-a-custom-uitableviewcell-in-ios-4をお読みください。

希望します。

P.S. UINibを使用することをお勧めします。なぜなら、xibファイルをロードする最適化された方法だからです。XIBを使用してカスタムのUITableViewCellを設定するには

2

、あなたはいくつかのことをしなければならない:

  • あなたのヘッダーにIBOutletを設定

    • は、テーブルビューのセルを構成し、Interface Builderで
    • ロードtableView:cellForRowAtIndexPath:
    • の内部XIBは、だから... ...のは、設定してみましょう任意の他の細胞のよう

    を、それを構成しますヘッダーファイルのIBOutlet

    @property (nonatomic, retain) IBOutlet UITableViewCell *dvarTorahCell; 
    

    実装ファイル内で合成することを忘れないでください。

    @synthesize dvarTorahCell; 
    

    ここで、セルを作成して設定しましょう。あなたは、以下に示すようにセル識別子とIBOutletに注意を払うようにしたい:

    コードで今すぐ

    enter image description here

    、ここに示したように、あなたのセルにXIBをアップロード:

    enter image description here

    Interface BuilderのCell Identifierが下のコードに示されているものと一致することに注意してください。

    次に、他のセルと同様にセルを設定します。

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
    if (cell == nil) { 
    
        [[NSBundle mainBundle] loadNibNamed:@"YUOnlineCell" owner:self options:nil]; 
        cell = dvarTorahCell; 
        dvarTorahCell = nil; 
    } 
    
    //configure your cell here. 
    

    はちょうどラベルなどサブビューを、アクセスしたとき、あなたは今、このようなtextLabeldetailTextLabelとしてプロパティ名ではなく、タグによってそれらを参照する必要があることに注意してください。あなたはiOSの5を使用している場合

  • 関連する問題