0

ストーリーボードを使用してカスタムテーブルビューセルを作成するチュートリアルに従っています。UILabelをセルのサブビューとしてドラッグし、そのタグを1に設定します。データソースコードに関して2つの質問があります。

  1. 2番目のデキューステートメントの目的は何ですか?カスタムセルを作成するためにストーリーボードを使用しない場合、これはinitメソッドであることを私は知っています。

  2. tableviewとself.tableviewの違いは何ですか?

    -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
    {
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        }
        NSDictionary *dToAccess = (self.tableView==tableView)?[self.arForTable objectAtIndex:indexPath.row] : [self.arForSearch objectAtIndex:indexPath.row];
        [(UILabel*)[cell viewWithTag:1] setText:[dToAccess valueForKey:@"name"]];
        [(UILabel*)[cell viewWithTag:2] setText:[dToAccess valueForKey:@"value"]];
        return cell;
    }
    
4

3 に答える 3

4

最初の質問では、2番目のdequeueReusableCellWithIdentifier:は間違いのように見えます。

UITableViewの仕組みは次のとおりです。

テーブルに50行ある場合でも、一度に10行しか表示されない場合は、10個のセルを作成するだけで済みます。ユーザーがスクロールすると、画面外に出たセルを常に解放して初期化する代わりに再利用できます。画面に表示される新しいセルを作成します。UITableViewは、画面外に移動したセルのリストを保持し、dequeueReusableCellWithIdentifier:を呼び出すと、画面外のセルのリストから削除して返します。ここから、セルをカスタマイズして再利用(テキスト、色などを変更)して返すことができます。繰り返しますが、これは「init」メソッドではなく、既存のセルを返します。

したがって、このUITableViewが最初に表示されたときに何が起こるかを見てみましょう。この例では10個の表示セルがあるため、tableViewはtableView:cellForRowAtIndexPath:を10回呼び出して、これらの10個のスロットにセルを表示します。これが呼び出されるたびに、表示する新しいUITableViewCellを初期化して返す必要があります。(この時点で、dequeueReusableCellWithIdentifier:再利用するオフスクリーンセルがないため、nilが返されます)

ユーザーがリストをスクロールすると、セルが画面外に表示され始め、新しいセルが表示される必要があります。一度に画面に表示する必要がある数のセルをすでに作成しているため、新しいセルを作成する必要はありません。dequeueReusableCellWithIdentifier:を呼び出して、画面外に出たセルへの参照を取得し、それを再利用できるようにする必要があります。

私はあなたのコードを次のように変更します:

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier];

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle: UITableViewCellStyleDefault
                                   reuseIdentifier: CellIdentifier] autorelease];
}

これで、新しいセルを作成する前に、再利用可能なセルをチェックしています。

2番目の質問については、

この例では、tableViewは渡されたtableViewを参照します(メソッドシグネチャの「tableView」を参照)。これとは別に、クラスでtableViewというプロパティが定義されている場合、self.tableViewはこのプロパティのゲッターを呼び出します。

于 2012-08-04T22:22:39.113 に答える
1

アップルが最初のiPhone用のUITableViewを開発したとき、スクロール時にパフォーマンスに問題がありました。その後、ある賢いエンジニアは、これの原因がオブジェクトの割り当てに代償が伴うことであることに気づき、セルを再利用する方法を考え出しました。

dequeueReusableCellWithIdentifierメソッドは、セルが再利用の準備ができているとマークされている場合にセルを返すために使用されます。

したがって、テーブルビューに多数の行があり、それをスクロールしようとすると、スクロールする前に前の画面から渡されたばかりのセルが、新しいセルを作成する代わりに再利用されます。

そして、あなたの2番目のqueのansを知るために。私はあなたがこのリンクを参照するべきだと思います:

http://www.iphonedevsdk.com/forum/iphone-sdk-development/17669-when-use-self-objectname-just-objectname.html

于 2012-08-04T07:46:33.567 に答える
0

2回デキューする必要がないため、このコードブロックは壊れています。

于 2012-08-13T20:02:59.440 に答える