1
static NSString *cellID = @"Cell Identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];

if (!cell)
{
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellID];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    [cell.contentView setBackgroundColor: [UIColor clearColor]];

    UIImage * box = [UIImage imageNamed: @"box.png"];
    UIView * cellbackgroundview = [[UIView alloc] initWithFrame: CGRectMake(7, 0, box.size.width, box.size.height)];
    [cellbackgroundview setBackgroundColor: [UIColor colorWithPatternImage: box]];

    UILabel * nameLabel = [[UILabel alloc] initWithFrame: CGRectMake( 0, 15, box.size.width, 19.0f)];
    nameLabel.text = name;
    [nameLabel setTextColor: [UIColor colorWithRed: 79.0f/255.0f green:79.0f/255.0f blue:79.0f/255.0f alpha:1.0f]];
    [nameLabel setFont: [UIFont fontWithName: @"HelveticaNeue-Bold" size: 18.0f]];
    [nameLabel setBackgroundColor: [UIColor clearColor]];
    nameLabel.textAlignment = NSTextAlignmentCenter;
    nameLabel.tag = 1;
    .....

}

((UILabel *)[cell viewWithTag:1]).text = name;
((UILabel *)[cell viewWithTag:2]).text = pitch;

上記のように viewWithTag を使用すると効率的なのはなぜですか?

4

4 に答える 4

13

私は答えに同意しません。タグを使用することは一般的には良い習慣ではないと思います.あなたの場合、それはただの怠惰です. UITableViewCellラベルをプロパティとして使用して、サブクラスを作成する必要があります。

マイク・ケラーはそれについての投稿を書きました:

ビューのタグにデータを保存しようとしていないと仮定しましょう。代わりに、ビューへの参照を取得するための迅速で汚れた方法が必要なだけです。このような状況でタグを使用しても問題ありませんか?

まあ、私が考えることができるほとんどすべての場合、実際のプロパティを使用してビューへの参照をどこかに格納する方が良いでしょう。それがIBOutletであろうと、クラスの通常のプロパティであろうとです。

カスタム ビューを UITableViewCell に追加する必要がありますか? それをサブクラス化し、実際のプロパティを追加します。(...)

実際のプロパティを使用することで、より強力なタイピング、より優れたネーミング、アプリの可動部分のより優れた可視性が得られ、viewWithTag の UIView* 戻り値の型をダウンキャストする必要がなくなります。また、viewWithTag: は呼び出しごとにビュー階層をトラバースする必要があるため、パフォーマンスも向上します。

私には、タグの使用は、純粋に怠惰によって引き起こされる別のパターンのように思えます。

于 2013-07-25T04:54:54.953 に答える
4

効率についてではなく、有効性について質問していると思います (つまり、なぜこのようにするのか)。

セルが正常にデキュー/再利用された場合に使用しているため、セルが最初に作成されたときに追加したviewWithTag適切なオブジェクトに引き続きアクセスできます。UILabel機能上の理由でこれを行っています (再利用されたセルに既にあるコントロールを再度追加したくないため)。

はい、これは優れた手法です。tagセルが最初に作成されたときにセル内の特定の目的のためにラベルを指定するために a を割り当てますがviewWithTag、後でセルを再利用するときにアプリ内でそのラベルをすばやく識別するために使用します。 . これは、再利用されたセルに冗長なコントロールを不必要に作成しないようにするためだけでなく、効率のために行われているとは言えません。

tagこの手法は数年前には珍しいものではありませんでしたが、最近では、ストーリーボード セル プロトタイプとUITableViewCellサブクラスを使用して不可解な数字を排除し、より読みやすいコードを生成する、より洗練されたアプローチが存在することに注意してください。

しかし、あなたのテクニックには何の問題もありません。それは一般的に、特に効率的であるとは言えず、最近では、コードの読みやすさの理由から、人々は他のアプローチに傾倒する可能性があります.

于 2013-07-24T22:36:29.970 に答える
0

あなたの場合、残りのコードを見なければ、UITableView でタグを使用しても意味がありません。そして、私が修正する他のいくつかのこともあります。

ただし、タグの使用が推奨されるケースは他にもたくさんあります。私の場合、その場でいくつかの UIView を作成し、それらを画面上の既存の UIView にサブビューとして追加するアプリがあります。あちこちで強力な参照を取得するのではなく、いつでも UIView を呼び出せるようにカスタム タグを割り当てて保持しています。

私はそれを考えます:

[myView viewWithTag:BACKGROUND_CONSTANT]

非常に読みやすいので、プロジェクトを肥大化させるサブクラスやクラス拡張を書く必要はありません。

また、パフォーマンスの検索については理解していますが、最近は昔(遠い過去)に比べてデバイスがかなり強力になっているので、仕事やタスクでシステムにストレスを与えて心配する必要はありません。ベスト プラクティスは、常にプロファイラーを実行し (XCode には適切なものがあります)、問題があれば測定して解決することです。

于 2013-07-25T09:28:37.620 に答える