5

私はNSDictionary私たちが言うことはこのようなものです:

key:       value:
name       Bookshelf
movies     Array containing: (Movie 1, Movie 2, Movie 3)
books      Array containing: (Book 1, Book 2, Book 3)
music      Array containing: (Music 1, Music 2, Music 3)

等々。今私がやろうとしているのは、このすべての情報を表示するtableViewを作成することですが、辞書キーが何であるかに基づいてさまざまなタイプのセルを使用します。たとえば、映画はcellForMovies本を使用し、cellForBooks音楽を使用cellForMusicします。それぞれに独自のレイアウトがあります。

明らかに、私は単純化しすぎていますが、うまくいけば、私がやろうとしていることを理解してください。

セクションとセクションごとに異なるセルタイプを実行すれば、これを実現できますが、実行したくありません。たとえば、次のようなテーブルを作成できるようにします。

cellForBooks
cellForMovies
cellForMovies
cellForMusic
cellForBooks

など...あなたが私に指摘できるアイデアやリソースはありますか?私はiOS5のサポート(ストーリーボード)だけを気にしています。

ソリューションで編集:

助けてくれたすべての人、特に最後のピースをまとめてくれたatticusに大いに感謝します。

最終的に機能したのは、データの構造を辞書の配列に変更してKey: type Value: book/movie/musicから、各エントリにを追加することでした。データ構造は次のようになります。

Array[0]: Dictionary: [Key: type Value: book], [Key: name Value: Physics];
Array[1]: Dictionary: [Key: type Value: music], [Key: name Value: Rock];

次に、セルを構成するためにこれを行いました。

NSString *CellIdentifier = @"Cell";
NSDictionary *object = [self.listOfStuff objectAtIndex:indexPath.row];
if ([[object objectForKey:@"type"] isEqualToString:@"book"]){
    CellIdentifier = @"BookCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"music"]){
    CellIdentifier = @"MusicCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"movie"]){
    CellIdentifier = @"MovieCell";
}

これらのそれぞれは、ストーリーボードに異なるテーブルビューセルを持っていました。cell.textLabel.textこれを行う必要があるように、組み込みのセル機能のいずれかを使用するかどうかを判断しました。

cell.textLabel.text = [object objectForKey:@"name"];
cell.textLabel.backgroundColor = [UIColor clearColor]; 
cell.textLabel.opaque = NO;

これが将来誰か他の人に役立つことを願っています。

4

5 に答える 5

6

あなたの- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPathメソッドでは、 に従って多くのタイプのセルを返すことができますindexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (indexPath.row > 5) { // Your conditions here to choose between Books and Movies
        BookCell *cell = [tableView dequeueReusableCellWithIdentifier:@"bookCell"];
        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault     reuseIdentifier:@"bookCell"];
        }
        return cell;
    } else {
        MovieCell *cell = [tableView dequeueReusableCellWithIdentifier:@"movieCell"];
        if (!cell)
        {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault     reuseIdentifier:@"movieCell"];
        }
        return cell;
    }
return nil;
}
于 2012-04-12T02:38:11.333 に答える
5

助けてくれたすべての人、特に最後のピースをまとめてくれたatticusに大いに感謝します。

最終的に機能したのは、データの構造を辞書の配列に変更してKey: type Value: book/movie/musicから、各エントリにを追加することでした。データ構造は次のようになります。

Array[0]: Dictionary: [Key: type Value: book], [Key: name Value: Physics];
Array[1]: Dictionary: [Key: type Value: music], [Key: name Value: Rock];

次に、セルを構成するためにこれを行いました。

NSString *CellIdentifier = @"Cell";
NSDictionary *object = [self.listOfStuff objectAtIndex:indexPath.row];
if ([[object objectForKey:@"type"] isEqualToString:@"book"]){
    CellIdentifier = @"BookCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"music"]){
    CellIdentifier = @"MusicCell";
}else if ([[object objectForKey:@"type"] isEqualToString:@"movie"]){
    CellIdentifier = @"MovieCell";
}

これらのそれぞれは、ストーリーボードに異なるテーブルビューセルを持っていました。cell.textLabel.textこれを行う必要があるように、組み込みのセル機能のいずれかを使用するかどうかを判断しました。

cell.textLabel.text = [object objectForKey:@"name"];
cell.textLabel.backgroundColor = [UIColor clearColor]; 
cell.textLabel.opaque = NO;

これが将来誰か他の人に役立つことを願っています。

于 2012-06-11T14:57:53.703 に答える
3

ストーリーボードで、動的プロトタイプを使用するように tableView を設定します。次に、使用するセルの種類ごとにセルを作成します。それらを適切にカスタマイズし、インスペクターでそれぞれに一意の再利用識別子を与えます (例: MovieCell)。

次に、tableview:cellForRowAtIndexPath: メソッドで、そのインデックス パスのコンテンツに適した種類のセルを決定します。indexPath のセルがムービー セルである必要がある場合は、次を使用してセルを作成します。

static NSString * MovieCellIdentifier = @"MovieCell"; // This must match the storyboard
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MovieCellIdentifier];

これにより、ストーリーボードで「MovieCell」として指定したセルが得られます。さらにカスタマイズする必要がある場合は、UITableViewCell サブクラスを作成し、それを Storyboard のセルに指定します。次に、返されたセルをキャストすることにより、ここでプロパティなどを参照してカスタマイズできます。

MovieTableViewCell *movieCell = (MovieTableViewCell *)cell;
// customize
于 2012-04-12T02:43:51.110 に答える
0

私の意見では、すべてのセル タイプを 1 つのセルに実装する必要があります。つまり、1 つのUITableViewCellクラスと、それらすべてに対して .xib が必要です。次にcellForRowAtIndexPath、セルを作成し、実際の要件に応じて、本または映画を構成するサブビューを表示/非表示にします。

このような設計では、セルはやや重量があります。ただし、複数のセル クラスを使用するよりは、セルの再利用の方が効率的であるため、それでもなお優れています ( [UITableView dequeueReusableCellWithIdentifier])。

UITableView は、1 つのタイプのセル向けに設計されていると思います。したがって、レイアウトが異なる場合でも、それらを 1 つの場所に配置し、フレームまたは表示/非表示を使用してセルの動作を制御できます。

于 2012-04-12T02:43:06.483 に答える
0

セル識別子として次を使用する必要があると思います。

- (UITableViewCell *)tableView:(UITableView *)tmpTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
NSString *cellIdentifier            =   [NSString stringWithFormat:@"Cell%d%d",indexPath.section,indexPath.row];
UITableViewCell *cell               =   [tmpTableView dequeueReusableCellWithIdentifier:cellIdentifier]; 
if (nil == cell) {
    cell    =   [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];

// do ur stuff here

}
return cell;
}
于 2012-04-12T05:13:52.263 に答える