如何在界面构建器中快速制作大量视图控制器?

时间:2011-08-03 19:18:38

标签: iphone objective-c uitableview uiview uiviewcontroller

我正在创建一个具有tableview和DetailViewController的应用程序。我正在使用Apple的“MultipleDetailViews”代码作为启动板。我想让这个应用程序在拆分视图中有大约100行,我想要为每一行更改细节视图(读取100个视图)。如何使用界面构建器但不生成100个类文件并重复更改名称?

目前我唯一的方法是手动创建单独的视图控制器(带有类文件)。然而,这是非常激动的。

无论如何我可以使用一个DetailViewController,在界面构建器中添加几个视图,并在tableview中选择一行时推送每个视图。

在每个视图上,我想添加一个背景图像和三个包含不同声音的按钮(每行的视图将有三个独特的声音)。我怎样才能创建三个IBAction并根据选择的行更改声音文件路径?

有没有时间有效的方法来做我要问的事情?

2 个答案:

答案 0 :(得分:2)

100个视图控制器类?这不好。

单个视图控制器类的100个实例?我不希望这样。

让我们为您提供您用2描述的行为,只有2.您有一个用于表视图的控制器和一个用于详细视图的控制器。就是这样。

当您在表视图中选择一行时,将该行索引传递给详细视图控制器,并为详细视图控制器提供基于该行加载正确图像和声音的方法。

这可以来自图像和声音资源的命名约定('background0','background1',...),也可以来自某个配置文件,它定义每行的背景图像和声音(a plist包含一系列字典:[{background:“moon.png”,firstSound:“clown.mp3”,secondSound:“moose.mp3”,thirdSound:“water.mp3},{...},... ])。

答案 1 :(得分:1)

听起来你的每个细节视图都足够相似,你可以创建一个单独的UIViewController实例,并在每次点击一个单元格时重新配置它。下面是一个示例,说明如何根据选择的行更改MultipleDetailViews项目以更改单个UIViewController实例的背景颜色。

static const NSUInteger kRowCount = 100;

- (void)viewDidLoad {
    [super viewDidLoad];
    self.contentSizeForViewInPopover = CGSizeMake(310.0, self.tableView.rowHeight*kRowCount);
    // Create an array of colors to cycle through
    self.colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];
}

#pramga mark - UITableViewDataSource methods

- (NSInteger)tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger)section {
    return kRowCount;
}

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    // Dequeue or create cell
    cell.textLabel.text = [NSString stringWithFormat:@"View Controller #%d", indexPath.row + 1];
    return cell;
}

#pramga mark - UITableViewDataDelegate methods

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Don't create a new view controller, just reconfigure the on that is already displayed
    DetailViewController *dvc = [self.splitViewController.viewControllers objectAtIndex:1];
    dvc.view.backgroundColor = [colors objectAtIndex:(indexPath.row % [colors count])];
}