- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
谢谢你看...
我什至不确定如何表达这个问题,更不用说寻找答案了...老实说,我已经尝试过,所以需要所有帮助!
这可能非常简单,因为我确信这是一种一直在发生的模式:
我的模型 (MainLevel*) 中有一个与其自身有关系的实体。
该实体用于法律的级别,唯一的要求是每个法律至少有一个(最高)级别。除此之外,从技术上讲,子级别的数量是无限的(但实际上通常约为 5 个,最多可能不超过 8-10 个)。正如所料,每个子级只有一个父级 (MainLevel.parentLevel),任何父级都可以有多个(或零个)子级 (NSSet *childLevels)。
我想做的是将这种关系的所有结构放入 UITableView
或 collectionView 中。
我有一个递归函数如下:
- (NSDictionary *)getStructureOfLawForLevel:(MainLevel *)level
{
NSMutableDictionary *mutableDict = [[NSMutableDictionary alloc]initWithCapacity:50];
MainLevel *currentLevel = level;
[mutableDict setObject:currentLevel.shortName forKey:@"name"];
if (level.childLevels) {
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES];
NSArray *sortdescriptors = @[sortDescriptor];
NSArray *children = [currentLevel.childLevels sortedArrayUsingDescriptors:sortdescriptors];
for (MainLevel *childLevel in children)
{
NSDictionary *dict = [self getStructureOfLawForLevel:childLevel];
[mutableDict setObject:dict forKey:@"sublevels"];
}
}
return [mutableDict copy];
}
然后在 viewWillAppear:
我有这个:
self.structure = [self getStructureOfLawForLevel:self.selectedLevel]
有了这个,我希望我在正确的路线上......(由于我现在正在排序的另一个问题而未经测试)。
尽管如此,我仍然不知道如何配置 UITableView
或 UICollectionView
。我的意思是我确信我可以通过添加一两个计数器并以这种方式获取行数和节数来做到这一点。这看起来太复杂了,我确信一定有一个更明显的方法,我只是没有看到...
数据的唯一标准是它必须按实体实例的 .order
属性排序,这不是唯一的。我的意思是,例如,每个 childLevel 都可以有一个订单号为 1 的 childLevel。它是那个父级别中的订单。
抱歉,如果这个问题已经被问过一千次了。我试图寻找答案,但似乎找不到我正在使用的搜索词。
除了放在屏幕上,没有编辑、添加、删除之外,我没有对这些数据做任何事情……不确定这是否相关。
为清楚起见进行编辑...
我不打算进行向下钻取类型的表格 View 。我想要一个 View 中整个结构的快照,然后我可能需要从中向下钻取(使用与模型中其他实体的关系)。
为我的解决方案编辑
这是我最终做的...
- (NSArray *)getStructureAsArrayForLevel:(MainLevel *)child
{
NSMutableArray *thisChildAndChildren = [[NSMutableArray alloc]initWithCapacity:2];
[thisChildAndChildren addObject:child];
if (child.childLevels)
{
// children exist
// sort the children into order
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES];
NSArray *sortdescriptors = @[sortDescriptor];
NSArray *children = [child.childLevels sortedArrayUsingDescriptors:sortdescriptors];
// get an array for each child via recursion
for (MainLevel *child in children)
{
[thisChildAndChildren addObject:[self getStructureAsArrayForLevel:child]];
}
}
return [thisChildAndChildren copy];
}
然后我使用类似的递归函数将数组转换为 NSAttributedString 并显示在 textView 中。
我真的不喜欢递归。我不知道为什么,但我发现很难理解逻辑,当它完成时,它似乎很明显......去想想吧!
感谢大家的建议、帮助等...
最佳答案
如果您可以使用第 3 方 Controller ,请查看 TLIndexPathTools .它处理树结构。例如,尝试运行 Outline示例项目。
你的 View Controller 看起来像这样(没什么大不了的):
#import "TLTableViewController.h"
@interface TableViewController : TLTableViewController
@end
#import "TableViewController.h"
#import "TLIndexPathTreeItem.h"
@implementation TableViewController
- (void)viewDidLoad
{
[super viewDidLoad];
MainLevel *topLevel = nil;//get the top level object here
TLIndexPathTreeItem *topItem = [self treeItemForLevel:topLevel depth:0];
self.indexPathController.dataModel = [[TLTreeDataModel alloc] initWithTreeItems:@[topItem] collapsedNodeIdentifiers:nil];
}
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
// customize cell configuration here
TLIndexPathTreeItem *item = [self.dataModel itemAtIndexPath:indexPath];
MainLevel *level = item.data;
cell.textLabel.text = [level description];
}
- (TLIndexPathTreeItem *)treeItemForLevel:(MainLevel *)level depth:(NSInteger)depth
{
NSMutableArray *childItems = [NSMutableArray arrayWithCapacity:50];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"order" ascending:YES];
NSArray *sortdescriptors = @[sortDescriptor];
NSArray *children = [level.childLevels sortedArrayUsingDescriptors:sortdescriptors];
for (MainLevel *child in children) {
TLIndexPathTreeItem *childItem = [self treeItemForLevel:child depth:depth + 1];
[childItems addObject:childItem];
}
//set identifier to some unique identifier, if one exists. Otherwise, the item itself
//will be used as the identifier
id identifier = nil;
//set cell identifier based on depth. This can be set to something unique for each
//depth, or set to a constant value. If nil, the value "Cell" is assumed.
NSString *cellIdentifier = [NSString stringWithFormat:@"Cell%d", depth];
//pass "level" to the data argument. Or pass any other data, e.g. include the depth @[@(depth), level]
TLIndexPathTreeItem *item = [[TLIndexPathTreeItem alloc] initWithIdentifier:identifier sectionName:nil cellIdentifier:cellIdentifier data:level andChildItems:children];
return item;
}
@end
如果您想要可折叠级别,您可以子类化 TLTreeTableViewController
而不是 TLTableViewController
。如果您需要更多帮助,请告诉我。
关于ios - CoreData,递归结构……我觉得,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17220891/
按照我目前安排代码的方式,下一行将为各种托管对象上下文运行。一些获取的实体将具有“complededDate”,而其他实体将没有“completedDate”属性。 let task = retrie
我在 import CoreData 的应用程序委托(delegate)中遇到此错误。据我所知,这是因为我将一个项目命名为 coreData。但是我更改了项目的名称,然后将其删除,并且删除了 /Lib
我想将记录保存在数组中并从 CoreData 中删除它们。我尝试过使用 NSCopying 但似乎 copyWithZone 不适用于 NSManagedObject。我真的很困惑,任何帮助将不胜感激
有时我的项目中很少会出现错误(比如每第 100 个请求)。我的一些 CoreData 的请求有 data:我无法使用该数据。我真的不明白为什么会发生这种情况以及如何防止这种行为。 错误数据输出示例:
如果您使用 Xcode 创建一个新项目并告诉它在您创建项目时创建一个 CoreData 模板,则您不需要 #import 在使用 ManagedObjects 的类中。 我已经将 Core Data
我对 SQLCipher 数据库加密和 CoreData 有疑问:当我将持久存储协调器与 SQLCipher 一起使用时,它总是在第一次应用程序重新启动后因一对多关系故障而崩溃。因此,当我第一次启动该
我有一个想要添加 iCloud 支持的应用程序。此应用程序从服务器加载数据,并将数据存储在 CoreData 中,以便 NSFetchedResultsController可以管理UITableVie
我正在从 coredata 表 STUDENT 中获取数据,并使用 Array 在 tableview 中显示所有学生姓名。在选择任何一个学生姓名后(点击 tableViewCell),它会从另一个表
我在构建过程中收到以下错误。 “API 滥用:尝试序列化非拥有协调器上的存储访问(PSC = 0x7fb5ae208890,存储 PSC = 0x0)CoreData 为什么我的应用程序会出现 Cor
当将 iOS 6.0.1 上的 Core Data 托管对象上下文保存到 SQLite 存储时,我遇到了一个奇怪的“CoreData 不支持持久的跨存储关系”异常。它涉及模型中 Quotes 和 Ab
我的应用程序有两个选项卡栏...每个选项卡栏都将用户带到一个向他显示项目列表的 TableView Controller 。第一个 View 允许用户在数据库中记录条目。另一个选项卡/ View 从数
Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省
我有一个名为visitDate的coredata属性 我想使用单独的选择器相互独立地设置日期和时间。 我意识到,当我设置时间时,我需要获取visitDate的现有日期、月份和年份,但只从NSDateP
我有这个代码示例演示如何更新核心数据中的对象,但是我遇到了一个小问题: // Retrieve the context if (managedObjectContext == nil) { m
我在 CoreData 中有一个包含整数值的列。在从中检索结果时,我希望将列值减去一个数字。 类似于:columnValue - someNumber(此数字由用户输入) 我知道我可能必须为此使用 N
有没有办法将 CoreData 模型文件(即实体描述:*.xcdatamodeld)导出到另一个项目。因为重新创建所有实体很无聊:-) 最佳答案 是的,只需将模型文件本身添加/复制到新项目中,就像任何
我使用核心数据编写了 iPhone 应用程序。当我在模拟器中运行应用程序时,它崩溃并出现以下错误: 2010-02-12 17:24:22.359 CrData[46122:4503] Unresol
我是 CoreData 的新手,在我的 iPhone 应用程序中,我想知道如何保存一些文本,然后将其重新加载。但诀窍是,当 UIDatePicker 中的日期与我相同时加载它。像日历一样保存它。 更新
我正在寻找在 CoreData 中编写一些基本查询的方法,但文档中没有示例。以下是我的查询: 我有一个费用对象,它有一个费用金额字段。 费用可以链接到 ExpenseCategory 对象。 Expe
我在标题中使用“单例”一词时可能存在术语不正确的情况。我现在正在寻找一种好的技术。我有一个名为 user 的实体,它存储用户登录的数据,例如用于发出服务器请求的 session key 。我只希望这些
我是一名优秀的程序员,十分优秀!