在 ios 中推出了一个树视图组件来表示分层数据。通过点击每个节点中的 (+) 可以展开树,点击 (-) 节点可折叠。
我的课看起来像这样,
//树项
@interface Node : NSObject
@property (nonatomic, strong) NSString *nodeCaption;
- (void)addNode:(Node *)node;
@end
//树模型类
@interface Tree : NSObject
- (id)initWithParentNode:(Node *)node;
//树视图类
@interface TreeView : UIView
- (id)initWithTree:(Tree *)tree andFrame:(CGRect)frame;
- (void)reloadData;
@end
//如何使用它
@implementation
Node *rootNode = [[Node alloc] init];
rootNode.caption = @"root";
NSArray *fruits1 = [NSArray arrayWithObjects:@"Apple", @"Peach", nil];
Node *fruit1Node = [[Node alloc] init];
fruit1Node.caption = @"set1";
for (NSString *fruit in fruits1) {
Node *aNode = [[Node alloc] init];
aNode.caption = fruit;
[fruit1Node addNode:aNode];
}
NSArray *fruits2 = [NSArray arrayWithObjects:@"Orange", @"Mango", nil];
Node *fruit2Node = [[Node alloc] init];
fruit2Node.caption = @"set2";
for (NSString *fruit in fruits2) {
Node *aNode = [[Node alloc] init];
aNode.caption = fruit;
[fruit2Node addNode:aNode];
}
[rootNode addNode:fruit1Node];
[rootNode addNode:fruit2Node];
Tree *tree = [[Tree alloc] initWithParentNode:rootNode];
TreeView *treeView = [[TreeView alloc] initWithTree:tree andFrame:self.frame];
[self.view addSubview:treeView];
[treeView reloadData];
@end
这将输出类似于下面的内容
-Root
-set1
Apple
Peach
-set2
Orange
Mango
在这种情况下,这完全没问题。但问题在于我们用来为树创建输入的代码,我们循环遍历我们持有的数据模型并将其转换为树组件可以使用的模型的地方。就我而言,我所有的树节点都是“类别”对象,我被迫将所有类别对象转换为节点对象以使用树。所以我想知道有没有一种方法可以使用树的用户打算使用的任何数据模型,而不是强制使用。
此外,我不想要求用户子类化我的 Abstract 类。因为,他们可能已经有了自己的父母。