-4

さて、目的 c を使用してテーブル ビューを作成していますが、データ ソースが正しく機能していません...

私のエラー:

2012-06-02 20:14:39.891 Dot Golf Scoring[195:707] *** Assertion failure in -[UITableView _createPreparedCellForGlobalRow:withIndexPath:], /SourceCache/UIKit/UIKit-1914.85/UITableView.m:6061
2012-06-02 20:14:39.895 Dot Golf Scoring[195:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'

私のコード:

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 16;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    return @"Comments On Your Round";
}

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

    cell.textLabel.text = @"Text Label";

    return cell;
}

テーブルビューがこの偽のデータで満たされないのはなぜですか???

4

2 に答える 2

7

セルを初期化することはありません。次のコードを使用します。

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

{


    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:@"UITableViewCell"];


    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                       reuseIdentifier:@"UITableViewCell"]
                autorelease];


        cell.textLabel.text = nil;                


    }

    if (cell) {

        //customization 
        cell.textLabel.text = @"Text Label";
    }

    return cell;
}

あなたはあなたが初心者だと言っています....説明させてくださいまず本を手に取ってみてください:

大オタク牧場ガイド

あなたが考えているのは、デキューは基本的に正しく初期化されているということですか? いいえ!デキューとは、基本的に、表示されていないセルをゼロにすることです。つまり、スクロールして通過します。したがって、cell == nilおそらく4つの状況で呼び出されます(私が考えることができます):

  1. 最初にテーブル ビューをセットアップするとき (セルは nil になります)
  2. データをリロードするとき
  3. このクラスに到着するたびに
  4. セルがテーブル ビューから見えなくなったとき

したがって、デキューの識別子は ID のようなものです。cell次に、 isかどうかを確認するステートメントでnil、 initializeを実行します。オーバーライドされたメソッドcellを見ることができます。これはまさに のタイプであり、カスタマイズできるさまざまな変数を持つさまざまなタイプがあります。デフォルトを見せてもらいました。次に、前述のデキュー識別子である を使用します。一致する必要があります。構造を改善するためだけに nilを使用します。この場合、各セルには同じテキストが含まれているため、実際には問題になりません。デキューしたセルが、実装した適切なカスタマイズで戻ってくるようにします。次に、セルが実際に有効になったら、カスタマイズできます。initinitWithStylecellreuseIdentifiertextLabel

また、各セルに同じテキストを使用しています。セルごとに異なるテキストを使用したい場合は、 に慣れてくださいNSArray。次に、配列countを提供してから、次のnumberOfRowsForSectionようにすることができます。

cell.textLabel.text = [array objectAtIndex: [indexPath row]];

メソッドで提供される引数はどこindexPathにありますか。変数は数値なので、すべてが適合します!NSIndexPathcellForRowAtIndexPathrowrow

うわー、それは正しく理解することがたくさんありました!さあ、客観的な初心者になるのをやめて、本を読み始めましょう!

詳細については、次を参照してください。

テーブル ビュー Apple ドキュメント

于 2012-06-03T00:30:42.010 に答える
3

Table View Programming Guideを読んだり、 UITableViews の再利用メカニズムを理解していないと思います;)

UITableViewsのセルは、セルが必要になるたびに UITableViewCell クラスのインスタンスを再割り当てすることを避けるために、再利用/リサイクルされます。これは、UITableView が多くの反応性を必要とするためです。特に、スクロールを高速にする必要があるため、テーブルビューをスクロールするときに、毎回新しい UITableViewCell インスタンスを割り当てると、インスタンスの作成中にテーブルビューが 1 秒間ハングするためです。

したがって、UITableViewCell 再利用メカニズムの背後にある考え方は、最小量のセルを割り当て、セルが必要になるたびに、以前に割り当てられたがユーザーではなくなったセルを再利用/リサイクルしようとすることです (スクロールしたために画面外にあるため)。 ただし、再利用できるセルがない場合は、自分で割り当てる必要があります。. コードでこの部分を実行するのを忘れたためnil、例外をスローするセルを返すことになります。


したがって、これを行う典型的なコードは次のとおりです。

static NSString* kCellId = @"Cell";
// First, try to reuse a cell that was previously allocated
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:kCellId];

// here, if a cell is returned, that means that we have an old cell
// that was used before but is no longer onscreen (so we can recycle it
// and just actualize its content)
// but if cell is nil, this means the UITableView didn't have a cell available to reuse
// so we need to create a new one
if (cell == nil)
{
   // So if we didn't have a old cell ready to reuse that have been returned, create one
   cell = [[[UITableViewCell alloc] initWithReusableIdentifier:kCellId] autorelease];
   // And configure every properties of the cell that will be common to every cell
   // and won't change even if the cell is recycled, eg:
   cell.textLabel.textColor = [UIColor redColor];
   cell.textLabel.font = [UIFont boldSystemFontOfSize:12];
   // etc
}
// And at this point, we have a cell, either newly created or that have been recycled
// So we configure every property that is row-dependant and change for each row, eg:
cell.textLabel.text = [myTextsArray objectAtIndex:indexPath.row];

注意:私はストーリーボードを使用したことはありませんが、知る限り、ストーリーボードを使用する場合、再利用可能なセルがない場合は「if」ステートメントを使用してセルを作成する必要はありません。ストーリーボードはセルデザインを使用して作成するためです。絵コンテ。ただし、これは、自分でセルを割り当てる必要がない唯一のケースです。

于 2012-06-03T00:33:13.777 に答える