在我之前的问题中,我能够确认我确实需要 UITableViewController 来显示我的 iPhone 应用程序的分层数据(使用 XCode 4.2)。
现在我想看看执行此操作的示例代码,这将在 XCode 4.2 中工作。假设分层数据的深度可以在 2 到 300 层之间。
我在哪里可以看到这样的示例代码/示例项目?
编辑- 我发现的大多数教程似乎都适用于旧版本的 xcode。
在我之前的问题中,我能够确认我确实需要 UITableViewController 来显示我的 iPhone 应用程序的分层数据(使用 XCode 4.2)。
现在我想看看执行此操作的示例代码,这将在 XCode 4.2 中工作。假设分层数据的深度可以在 2 到 300 层之间。
我在哪里可以看到这样的示例代码/示例项目?
编辑- 我发现的大多数教程似乎都适用于旧版本的 xcode。
这个问题非常广泛,要完成这项工作有多个部分。如果您将其分解为谨慎的步骤,那么您可能已经可以在 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 的属性,它是下一级的数组。
这样就可以了。
在实现 Joel 的答案时,您还需要设置导航项的标题,以便在每个嵌套视图的后退按钮上显示正确的文本:
[[childView navigationItem] setTitle:<Title from selected row>];
此外,如果您使用情节提要,而不是实例化视图控制器使用
[storyboard instantiateViewControllerWithIdentifier:@"myViewController"];
其中 myViewController 是分配给 MyViewController 的情节提要 ID