2011-11-14 4 views
0

그래서 탐색해야하는 UITableViewController의 광범위한 계층 구조가 있습니다. 각 사용자는 자신 만의 Custom View Controller가 필요합니다. 특정 테이블 뷰에 대한 내 데이터 소스는 현재 "A, B, C, D, E, F"와 같은 문자열 배열입니다. 내 didSelectRowAtIndexPath 방법의 긴 목록 경우이 (의사) 같은 문장 :UITableViewController 데이터 소스 용 사용자 정의 클래스

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

난이 지저분하다고 생각합니다. 이것을하기위한 더 깨끗한 방법이 있어야합니다. 이에 대한 모범 사례는 무엇입니까? 내 생각은 cellTitle 및 viewController 클래스가 포함 된 사용자 지정 클래스를 만드는 것입니다. 그럼 내 데이터 소스로 그 배열을 사용할 수 있습니다 이런 종류의 일을 :

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

생각나요?

답변

2

최상위 테이블 뷰 컨트롤러에 속성을 추가

@property (strong) NSDictionary *viewControllerClassForCell; 

viewDidLoad 또는 다른 초기화 방법 :

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

didSelectRowAtIndexPath에서 :

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

당신은 사용할 수 있습니다 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]] 
관련 문제