2

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

iOS开发——无限关卡的uitableview

现在我想看看执行此操作的示例代码,这将在 XCode 4.2 中工作。假设分层数据的深度可以在 2 到 300 层之间。

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

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

4

2 回答 2

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. 加载您的数据

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

步骤 3. 展示您的数据

这实际上很简单。创建一个使用表视图的视图控制器(UITableViewController 或 UIViewController 嵌入了 UITableView)。在视图控制器上为这个 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 的属性,它是下一级的数组。

这样就可以了。

于 2012-04-29T03:16:26.707 回答
1

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

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

此外,如果您使用情节提要,而不是实例化视图控制器使用

[storyboard instantiateViewControllerWithIdentifier:@"myViewController"];

其中 myViewController 是分配给 MyViewController 的情节提要 ID

于 2013-04-21T01:47:46.343 回答