1. ホーム
  2. uitableview

[解決済み] iOS 6 UITableView dequeueReusableCellWithIdentifier:forIndexPath を使用した場合のUITableViewCellのスタイル設定。

2023-07-16 13:01:20

質問

を設定する方法を探しています。 UITableViewCellStyle の新しいメソッドを使用する場合、iOS 6 の UITableView .

以前は UITableViewCell を変更することにしていました。 UITableViewCellStyle を呼び出す際に、異なるタイプのデフォルトセルを作成するようにします。 initWithStyle: を呼び出したときに、異なるタイプのデフォルトセルを作成することができましたが、私が調べたところでは、これはもはやそうではありません。

に関する Apple のドキュメントは UITableView は述べています。

戻り値 : 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 , UITableViewCellStyleValue2UITableViewCellStyleSubtitle ?

私は、サブクラス UITableViewCell をサブクラス化したいわけではなく、iOS 6 以前と同じようにデフォルトの型を変更したいだけです。Apple が強化されたメソッドを提供しながら、その実装をサポートするための最小限のドキュメントしかないのは奇妙に思えます。

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

どのように解決するのですか?

サブクラスを作成したくないとおっしゃいましたが、避けられないようです。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>];
}