UITableViewController数据源的自定义类

时间:2011-11-14 22:17:53

标签: iphone objective-c ios

所以我需要浏览大量的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...

思想?

2 个答案:

答案 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]]