所以我需要浏览大量的UITableViewControllers层次结构。每个人都需要它自己的自定义视图控制器。我的任何特定tableview的数据源当前是一个字符串数组,如“A,B,C,D,E,F”。我的didSelectRowAtIndexPath方法是一个很长的if语句列表,像这样(伪代码):
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...
思想?
答案 0 :(得分: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 :(得分: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]]