2011-11-14 6 views
0

私は、ナビゲートする必要があるUITableViewControllerの広範な階層を持っています。それぞれがカスタムビューコントローラを必要とします。特定のテーブルビューの私のデータソースは、現在、 "A、B、C、D、E、F"のような文字列の配列です。UITableViewControllerのカスタムクラスDatasource

if cell.text = "A" 
    alloc init AViewController 
    navigationController push aViewController 
if cell.text = "B" 
    alloc init BViewController 
    navigationController push bViewController 

私はこれが厄介だと思う:私didSelectRowAtIndexPath方法は、この(擬似コード)のように、if文の長いリストです。これを行うためのよりクリーンな方法が必要になりました。これに関するベストプラクティスは?私の最善のアイデアは、cellTitleとviewControllerクラスを含むカスタムクラスを作ることです。それから私は私のデータソースとして、これらの配列を使用して、この種のもの行うことができます。

UITableViewController *newView = [custom.viewControllerClass alloc] init... 

思考?

答えて

2

トップレベルのテーブルビューコントローラのプロパティを追加します。didSelectRowAtIndexPath

viewControllerClassForCell = [NSDictionary dictionaryWithObjectsAndKeys: 
    [AViewController class], @"A", 
    [BViewController class], @"B", 
    // etc. 
    nil]; 

:あなたが使用することができます

Class vcClass = [self.viewControllerClassForCell objectForKey:cell.text]; 
[self.navigationController pushViewController:[[vcClass alloc] initWithNibName:nil bundle:nil] animated:YES]; 
1

viewDidLoadまたは他の初期化方法では

@property (strong) NSDictionary *viewControllerClassForCell; 

NSClassFromString()とあなたのcell.textで文字列を構築します。

あなたdidSelectRowAtIndexPathでこのような何か:

NSString * className = [NSString stringWithFormat:@"%@ViewController", cell.text]; 
UIViewController * vc = [[NSClassFromString(className) alloc] init]; 
[self.navigationController pushViewController:vc] 

あるいは、より古典的な方法で、あなたは、パラメータとして名前を受け取るメソッドを持っており、選択のViewController

- (UIViewController*) viewControllerForName: (NSString*) theName { 
    if ([theName isEqualToString:@"A"]) return [[AViewController alloc] init]; 
    else if (....) 
} 
のインスタンスを返すことができます

didSelectRowAtIndexPathで:

[self.navigationController pushViewController:[self viewControllerForName:cell.text]]