2011-07-19 11 views
3

dataModelに格納されているsavedGames配列から戻ってくるオブジェクトの種類に応じて、いくつかのカスタムUITableViewCellを返すようにしています。私の質問は、私はこれについて正しい方向に行くのですか?私はこれまでこれをやっておらず、私が正しい道を歩いていることを確かめたいと思っていました。cellForRowAtIndexPathから複数のUITableViewCellサブクラスを返す?

注:新しいセルは別の場所に割り当てられ、init-edされているため、以下のコードには表示されません。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger row = [indexPath row]; 
    SharedDataModel *dataModel = [SharedDataModel sharedInstance]; 
    id genericGameAtRow = [[dataModel savedGames] objectAtIndex:row]; 

    if([genericGameAtRow isMemberOfClass:[GameZoneOne class]]) { 
     CellZoneOne *cell = [tableView dequeueReusableCellWithIdentifier:@"ZONEONE_ID"]; 
     return cell; 
    } 

    if([genericGameAtRow isMemberOfClass:[GameZoneTwo class]]) { 
     CellZoneTwo *cell = [tableView dequeueReusableCellWithIdentifier:@"ZONETWO_ID"]; 
     return cell; 
    } 
    return nil; 
} 

EDIT:クイック質問は下に有用ではnilを返して、私はそれはメソッドが戻り値を持っていない回避知っているが、場合のどれもsがあなたが「取得するつもり火「場合」セルを返す必要があります "というエラーが表示されます。明らかに可能なすべてのオプションをカバーすることが重要ですが、最終的なリターンはデフォルト(バニラ)UITableViewCellを返す方が良いでしょうか? ... ちょっと興味があるんだけど。

答えて

5

はいこれは正しい解決策です。

個人的には、それは一般的に悪いアーキテクチャの兆候であるため、-[id<NSObject> isKindOfClass:]から離れることになります。代わりにsavedGames配列内のすべての可能なクラスにgameZoneプロパティを追加しました。そしてそれがゾーン/タイプであることが明示的に尋ねられました。

+1

私は建築的な観点から同意します。プロパティを設定します。 –

+1

合意。その 'gameZone'を使って自動的にセル識別子を作ることもできます。この方法では、新しいゾーンを追加するときにテーブルコードを変更する必要はありません。または、適切なセルを返す 'GameZone'にカテゴリを追加することもできます(' return [genericGameAtRow tableViewCell] ')。ここでは、データモデルコードからUIKitを削除するためのカテゴリを使用します。すべてのきめ細かな解法があり、isKindOfClassより優れています。 –

+0

私はそれを再因子付けしてgameZoneプロパティを追加することをお勧めします。ロブにもありがとう。 – fuzzygoat

1

あなたが表示するコードは大丈夫です、そして、正しい方法です。

+0

ありがとう、ヴィンス、非常に感謝します。 – fuzzygoat

0

私は間違っているかもしれませんが、あなたの配列内の各アイテムがuitableviewを構築するために使用されていれば、セルを構築するための独自のプロパティを持っていた方が良いでしょうか?

ですから、クラスのUITableViewCell多分

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
int row = [indexPath row]; 
[_myArray[row] formatCellAndSetData]; 

またはカスタムのさえ

return [_myArray[row] buildCell]; 

各ような何かを行うことができ、すべてが同じ方法formatAndSetDataを持つことになりますが、それぞれが異なり、それを実装することができます。そのようにすると依存関係はあなたのカスタムクラスからインジェクトされるため、依存関係はありません:

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

関連する問題