用于在iPhone应用程序中显示N深度的分层数据的示例代码

时间:2012-04-29 02:16:40

标签: iphone xcode4.2 uitableview

在我之前的问题中,我能够确认我确实需要UITableViewController来显示我的iPhone应用程序的分层数据(使用XCode 4.2)。

iOS development - uitableview with infinite levels

现在我想看看这样做的示例代码,它可以在XCode 4.2中运行。假设分层数据可以是2到300级之间的任何位置。

我在哪里可以看到类似这样的示例代码/示例项目?

编辑 - 我发现的大多数教程似乎都适用于较旧版本的xcode。

2 个答案:

答案 0 :(得分:7)

这个问题非常广泛,这项工作有很多部分。如果您将其分解为谨慎的步骤,那么您可以找到SO上每个步骤的示例代码,或者询问更具体的问题。如果您需要任何单独步骤的帮助,请发表评论,我可以为您提供指导,但这里有太多内容可以输入一个问题。

以下是我认为你需要解决这个项目的方法:

步骤1.创建数据结构

您将要为每个级别使用NSArray。 NSArray可以存储NSDictionaries列表或您自己的自定义NSObject类。两者都有效。如果存在标准化数据结构,那么我建议您创建自己的对象,然后为数组中的每个条目存储该对象。它使得访问对象的属性比对每次访问进行字典查找更容易。当然,您存储在数组中的对象将需要另一个NSArray的字段,该字段将是它下面的子数组。例如,你可能会有这样的事情:

@interface MyObject : NSObject {
    NSString *nodeTitle;
    NSString *nodeDescription;
    NSArray *childArray;
}

@property (nonatomic, copy) NSString *nodeTitle;
@property (nonatomic, copy) NSString *nodeDescription;
@property (nonatomic, copy) NSArray *childArray;

在你班级的.m文件中,你需要在init上将每个ivar设置为nil并在dealloc上释放每个ivar。

步骤2.加载数据

您的Feed是在一个大批量中完成的,还是您可以从服务器一次请求一个级别?理想情况下,如果可以避免它,则不会将300个级别存储到内存中(这听起来像一个非常大的xml文件)。理想情况下,当用户逐步进入层次结构时,您将加载每个级别。但也许每个节点上的数据量很少,您可以一步加载所有数据,而不是占用大量内存。你需要找出负载例程(一次性或按需)。

步骤3.展示您的数据

这实际上非常简单。创建一个使用表视图的视图控制器(UITableViewController或嵌入了UITableView的UIViewController)。在视图控制器上为此ivar创建一个类型为NSArray的ivar和一个属性(复制它)。然后,当您创建此视图控制器时,在将其推送到导航堆栈之前,将NSArray传递给当前级别。然后设置表视图以呈现作为属性传递给视图控制器的NSArray ivar。因此,例如当有人单击表中加载子级别的行时,请执行以下操作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    int row = [indexPath row];
    MyViewController *childView = [[MyViewController alloc] init];
    childView.contentArray = ((MyObject *)[contentArray objectAtIndex:row]).childArray;
    [self.navigationController pushViewController:childView animated:YES]; 
    [childView release];     
}

这假设您已为数组中的每个条目创建了名为MyObject的标准对象,并且它具有一个名为childArray的属性,该属性是下一级别的数组。

那就行了。

答案 1 :(得分:1)

在实施Joel的答案时,您还需要设置导航项的标题,以便在每个嵌套视图的后退按钮上显示正确的文本:

[[childView navigationItem] setTitle:<Title from selected row>];

此外,如果您使用的是故事板,请使用

而不是实例化视图控制器
[storyboard instantiateViewControllerWithIdentifier:@"myViewController"];

其中myViewController是分配给MyViewController的故事板ID