7

私は TableView をまとめていますが、同じテーブルで複数のセル クラスを使用する必要があります。

たとえば、cellForRowAtIndexPathメソッドで複数のセル クラスを使用するにはどうすればよいでしょうか。

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

    // Configure the cell...

    return cell;
}

単純にカスタム クラスに置き換えUITableViewCellて、if ステートメントを使用してインデックスに応じてクラスを調整できることはわかっていますが、それは少し面倒ではありませんか?合理的で、おそらくこれを行う最もインテリジェントな方法は何でしょうか?

4

3 に答える 3

9

確かにできます。カスタム セルの新しいインスタンスを作成し、新しい CellId を与えるだけです。

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

   if (condition1)
    {
        static NSString *CellIdentifier1 = @"Cell1";
        UITableViewCell *cell = 
         [tableView dequeueReusableCellWithIdentifier:CellIdentifier1];

        // TODO: if cell is null, create new cell of desired type.  
        // This is where you    create your custom cell that is 
        // derived form UITableViewCell.
    }
    else
    {
        static NSString *CellIdentifier2 = @"Cell2";
        UITableViewCell *cell = 
         [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];

        //TODO: if cell is null, create new cell of desired type

    }
    // Configure the cell...

    return cell;
}
于 2012-07-25T22:06:13.193 に答える
8

これを行うには、.xib ファイルまたはストーリーボードにいくつかのプロトタイプ セルを含めるようにテーブルを定義します。以下の Xcode スクリーン ショットで、テーブル ビューの「動的プロトタイプ」の設定に注意してください。

ここに画像の説明を入力

各プロトタイプ セルには、一意の再利用識別子を指定する必要があります。この例では、最初のセル タイプには再利用識別子@"ScanCell"があり、2 番目のセル タイプには があり@"DetailCell"ます。次に、-tableView:cellForRowAtIndexPath:メソッドで、に渡す再利用識別子を選択することで、使用するセルのクラスを選択するだけです-dequeueReusableCellWithIdentifier:

これは、私自身のアプリの 1 つから取った例です。

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString * cellIdentifier = @"DetailCell";
    if ([indexPath section] == 0) {
        cellIdentifier = @"ScanCell";
    }
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier
                                                             forIndexPath:indexPath];
    if ([indexPath section] == 1) {
        CBPeripheral * peripheral = (CBPeripheral *)[self.appDelegate.peripherals objectAtIndex:[indexPath row]];
        cell.textLabel.text = [peripheral name];
        cell.detailTextLabel.text = [self.appDelegate.peripheralKeys objectAtIndex:[indexPath row]];
    }
    return cell;
}

プロトタイプ セルに異なるクラスを持たせたい場合は、.xib または Storyboard ファイルでクラスを設定するだけです。

于 2012-07-25T22:05:36.273 に答える
3

ある時点で、さまざまなセル クラスをデータ ソース内のさまざまなアイテム タイプに関連付ける必要があります。声明はif行く方法かもしれません。次のように、これを別のメソッドにカプセル化できます。

+(Class)cellClassForItem:(id)rowItem
{
    Class theClass = [ UITableViewCell class ] ;

    if ( [ rowItem isKindOfClass:[ ... class ] ] )
    {
        theClass = [ CellClass1 class ] ;
    }
    else if ( [ rowItem isKindOfClass:[ ... class ] ] )
    {
        theClass = [ CellClass2 class ] ;
    }

    return theClass ;
}

または、データ ソース内の各アイテムに以下を実装させることもできますprotocol

@protocol DataSourceItem <NSObject>
-(Class)tableViewCellClass ;
@end

これで、デリゲート メソッドは次のようになります (2 番目の手法を想定)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id<DataSourceItem> item = (id<DataSourceItem>)[ tableView itemForRowAtIndexPath:indexPath ] ;
    Class cellClass = [ item tableViewCellClass ] ;
    NSString * cellID = NSStringFromClass( cellClass ) ;

    UITableViewCell *cell = [ tableView dequeueReusableCellWithIdentifier:cellID ] ;
    if ( !cell )
    {
        cell = [ [ cellClass alloc ] initWithStyle:... reuseIdentifier:cellID ] ;
    }

    cell.value = item ;

    return cell;
}
于 2012-07-25T22:06:51.447 に答える