我应该如何使用Viewcontrollers

时间:2014-08-18 16:45:30

标签: ios viewcontroller

我制作了一个包含2个桌面视图的应用。第一个有一堆单元格,它们通向下一个表格视图(根据选择的单元格,可以有不同的数据)。 我的问题是,为第二个菜单设置一堆视图控制器更好(每个单元选择1个,或者有一个视图控制器并在其上加载不同的数据。

3 个答案:

答案 0 :(得分:3)

没有对错。但是,我建议您使用不同的viewcontrollers。特别是如果您使用故事板,这非常简单。只需使用适当的viewcontroller连接不同的单元格类型,然后使用-performSegueWithIdentifier:方法传递数据。 也许如果你想添加一些关于数据类型的细节等等,我可以给你一个更充分的答案。

修改:

在这种情况下,使用单个第二个tableviewcontroller实际上更有意义,因为输入格式始终相同,输出基于输入数据。你可以这样做:

<强> FirstTableViewController.h

@interface FirstTableViewController.h : UITableViewController

// array containing NSArrays which themselves contain NSStrings
@property (nonatomic, strong) NSArray *textArrays;

@end

<强> FirstTableViewController.m

@implementation FirstTableViewController

@synthesize textArrays;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     return self.textArrays.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *Identifier = @"Your Identifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier forIndexPath:indexPath];
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier];
    }

    NSArray *textArray = self.textArrays[indexPath.row];
    if (textArray != nil && [textArray isKindOfClass:[NSArray class]]) {
        // configure cell
    }

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UITableViewCell *cell = (UITableViewCell *)sender;
    NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
    SecondTableViewController *controller = [segue destinationViewController].
    controller.textArray = self.textArrays[indexPath.row];
}

@end

<强> SecondTableViewController.h

@interface SecondTableViewController.h : UITableViewController

// array containing NSStrings
@property (nonatomic, strong) NSArray *textArray;

@end

<强> SecondTableViewController.m

@implementation SecondTableViewController

@synthesize textArray;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
     return self.textArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *Identifier = @"Your Identifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Identifier forIndexPath:indexPath];
    if(cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Identifier];
    }

    NSString *text = self.textArray[indexPath.row];
    if (text != nil && [text isKindOfClass:[NSString class]]) {
        // configure cell, e.g. cell.textLabel.text = text;
    }

    return cell;
}

@end

请记住,总有几种方法可以实现某些目标。这只是我的方式,它不一定是你的。但是,我希望这会有所帮助。

答案 1 :(得分:0)

确保您了解类和该类的实例(即对象)之间的区别。通常,当用户点击第一个表格中的单元格时,您将创建一个新的视图控制器对象,并使用所需的任何数据加载它以显示与该敲击单元格对应的内容,并将其推送到您的导航堆栈。当用户完成查看该内容后,他们会回到&#34;返回&#34;按钮切换回上一个视图控制器。当发生这种情况时,&#34;详细信息&#34;视图控制器通常是已取消分配的,因为没有其他对象引用它。当用户点击另一个单元格时,该过程重复 - 创建,配置,推送并最终解除新的视图控制器。

因此,这意味着您将拥有两个视图控制器,并且在任何给定时间都有一个或两个视图控制器对象(不包括导航控制器) ,但随着时间的推移,您最终会创建详细视图控制器类的许多实例。您可以创建一个详细视图控制器的单个实例并在必要时重复使用它,但这样做并没有真正的优势,它最终成为主视图控制器需要的另一个东西跟踪。

当然,如果主表中的不同单元格可能导致显着不同的数据需要以不同的方式显示,那么您最终可能不仅仅是两个视图控制器类。在这种情况下,当用户点击一个单元格时,您必须确定要使用哪种详细视图控制器,然后实例化该控制器。例如,点击一个单元格可能会导致有关某个人的信息,而另一个单元格可能会导致图片,而第三个单元格可能会生成一个地图。

答案 2 :(得分:0)

我会使用2个TableViewController和Custom Cells来执行此操作。基本上,一旦用户在第一个TableView上选择一个单元格,您将使用适当的数据填充第二个表视图,并使相应的自定义单元格出列以显示数据。