82

UITableViewCellStyleiOS6forで新しいメソッドを使用するときにを設定する方法を見つけようとしていUITableViewます。

以前は、Iを作成するときに、呼び出し時にさまざまなタイプのデフォルトセルを作成するように列挙型をUITableViewCell変更していましたが、収集できるものからは、これは当てはまりません。UITableViewCellStyleinitWithStyle:

UITableView州のAppleドキュメント:

戻り値:関連する再利用識別子を持つUITableViewCellオブジェクト。このメソッドは常に有効なセルを返します。

説明:パフォーマンス上の理由から、テーブルビューのデータソースは、tableView:cellForRowAtIndexPath:メソッドの行にセルを割り当てるときに、通常UITableViewCellオブジェクトを再利用する必要があります。テーブルビューは、データソースが再利用のためにマークしたUITableViewCellオブジェクトのキューまたはリストを維持します。テーブルビューに新しいセルを提供するように求められたら、データソースオブジェクトからこのメソッドを呼び出します。このメソッドは、既存のセルが使用可能な場合はキューを解除するか、以前に登録したクラスまたはnibファイルに基づいて新しいセルを作成します。

重要:このメソッドを呼び出す前に、registerNib:forCellReuseIdentifier:またはregisterClass:forCellReuseIdentifier:メソッドを使用してクラスまたはnibファイルを登録する必要があります。

指定した識別子のクラスを登録し、新しいセルを作成する必要がある場合、このメソッドは、initWithStyle:reuseIdentifier:メソッドを呼び出してセルを初期化します。nibベースのセルの場合、このメソッドは、提供されたnibファイルからセルオブジェクトをロードします。既存のセルが再利用可能であった場合、このメソッドは代わりにセルのprepareForReuseメソッドを呼び出します。

cellForRowAtIndexPathこれは、新しいメソッドを実装した後の私の新しい外観です。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"cell_identifier";

    [tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:cellIdentifier];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    return cell;
}

これまでのコードは正常に機能しますが、常にデフォルトのスタイルを返します。UITableViewCellStyleDefault、、、などの他のスタイルでセルを作成できるようにUITableViewCellStyleValue1、これUITableViewCellStyleValue2を変更するにはどうすればよいUITableViewCellStyleSubtitleですか?

サブクラスにはしたくありません。iOS6UITableViewCellより前のバージョンと同じようにデフォルトのタイプを変更したいだけです。Appleが拡張メソッドを提供するのは奇妙に思えますが、その実装をサポートするための最小限のドキュメントが必要です。

誰かがこれをマスターしたか、または同様の問題に遭遇しましたか?合理的な情報を見つけるのに苦労しています。

4

6 に答える 6

106

サブクラスを作成したくないとおっしゃっていたと思いますが、それは避けられないようです。iOS 6.0シミュレーターでのテスト中のアセンブリコードに基づいて、実行することにより(またはそのサブクラス)UITableViewの新しいインスタンスを作成しますUITableViewCell

[[<RegisteredClass> alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:<ReuseIdentifier>]

つまり、送信されたスタイル(UITableViewCellStyleDefault)はハードコーディングされているように見えます。これを回避するには、デフォルトの初期化子をオーバーライドし、initWithStyle:reuseIdentifier:使用するスタイルを渡すサブクラスを作成する必要があります。

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    // ignore the style argument, use our own to override
    self = [super initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseIdentifier];
    if (self) {
        // If you need any further customization
    }
    return self;
}

また、セルが要求されるたびに送信するのではなく、送信registerClass:forCellReuseIdentifier:する方がよい場合があります。viewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.tableView registerClass:<RegisteredClass> forCellReuseIdentifier:<ReuseIdentifier>];
}
于 2012-11-02T11:27:36.577 に答える
61

dequeueReusableCellWithIdentifierは非推奨ではないため、新しいを使用する必要はありませんdequeueReusableCellWithIdentifier:forIndexPath:

カスタムセルクラスを使用している場合は、適切なレジスタメソッド(viewDidLoad内)とともに新しい方法を使用しますが、UITableViewCellStyle列挙型の1つを使用する場合は、古い方法を使用します。

于 2012-11-22T17:21:18.117 に答える
11

ストーリーボードインターフェイスビルダーを使用すると、無関係なサブクラスを回避できます。

  1. ストーリーボードビューで、テーブルビューセルのプロトタイプセル(テーブルビュー上)を選択します
  2. ユーティリティビューの属性インスペクタで、スタイル値を変更します
  3. (オプション)SelectionやAccessoryなどの他の値を変更します

新しいiOS6.0dequeueReusableCellWithIdentifier:forIndexPath:は、新しいセルを割り当てて返すときにこれらの値を使用します。(Xcode4.5.2を使用したiOS6.0コンパイルでテスト済み)

于 2013-02-11T02:16:07.720 に答える
7

1つのファイルを保存する別の方法は、ペン先を作成してregisterNib:forCellReuseIdentifier:代わりに使用することです。

Nibの作成は簡単です。InterfaceBuilderで新しい.xibファイルを作成します。デフォルトのビューを削除します。テーブルビューセルオブジェクトを追加します。属性インスペクターを使用して、セルのスタイルを変更します。(ここでは、他の属性を調整してセルをさらにカスタマイズすることもできます。)

次に、テーブルビューコントローラのviewDidLoadメソッドで次のように呼び出します。

[self.tableView registerNib:[UINib nibWithNibName:@"StyleSubtitleTableCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"Cell"];
于 2013-04-18T17:58:55.400 に答える
0

ボロットの答えは正しいです。シンプルで、XIBファイルを作成する必要はありません。

Objective-Cの代わりにSwiftを使用してそれを行っている人のために彼の答えを更新したかっただけです:

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: .value1, reuseIdentifier: reuseIdentifier)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
于 2017-12-15T14:40:26.020 に答える
-5

initWithStyle: reuseIdentifier:これに対する私の解決策は、を使用して取得した後に呼び出すこと[self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath]です。結局のところ、initは単なる別のセレクターであり、コンパイラーは、すでに初期化されたオブジェクトでの呼び出しに制限を設けていません。ただし、initを呼び出した結果を使用しないことについて文句を言うので、次のようにします。

UITableViewCell* cell = [self.tableView dequeueReusableCellWithIdentifier:@"cellId" forIndexPath:indexPath];
cell = [cell initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellId"];

これはSwiftでは機能しないと思います...

于 2015-06-11T08:17:40.940 に答える