gpt4 book ai didi

iphone - ios TreeView 组件的数据模型

转载 作者:行者123 更新时间:2023-12-01 17:56:46 24 4
gpt4 key购买 nike

在 ios 中推出了一个 TreeView 组件来表示分层数据。通过点击每个节点中的 (+) 可以展开树,点击 (-) 节点可折叠。

我的课看起来像这样,

//树项

@interface Node : NSObject
@property (nonatomic, strong) NSString *nodeCaption;

- (void)addNode:(Node *)node;
@end

//树模型类
@interface Tree : NSObject

- (id)initWithParentNode:(Node *)node;

// TreeView 类
@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 类。因为,他们可能已经有了自己的 parent 。

最佳答案

使用协议(protocol)

如果我理解正确,您希望允许客户端使用他们自己的自定义对象作为“节点”对象。

如果这是正确的,那么您可以将“节点”作为协议(protocol)而不是类,例如:

// If you want to add your objects to a tree, then you must implement this protocol...
@protocol NodeProtocol <NSObject>

@property (nonatomic, strong, readonly) NSMutableArray *children;

-(void)addNode:(id <NodeProtocol>)node; // Node items must support adding children nodes
-(NSString *)description; // Node items need to be able to print a textual description of themselves

@end

// Custom class implements the protocol
@interface CustomNode : NSObject <NodeProtocol>
...
@end

使用封装对象

或者,您可以将抽象对象封装在 Node 对象中,例如:
@interface Node : NSObject
@property (nonatomic, strong) NSObject *nodeItem;
-(void)addNode:(Node *)node;
@end

使用类别

作为第三种选择,您可以改为在 NSObject 上实现类别并使用 objc_setAssociatedObject 将数据附加到对象。例子:

类别
#import "NSObject+NodeCategory.h"

#import <objc/runtime.h>

static char const *kNodeKey = "NodeKey";

@implementation NSObject (NodeCategory)

-(void)addNode:(NSObject *)node
{
NSMutableArray *children = [self children];
if (!children) children = [NSMutableArray new];
[children addObject:node];
[self setChildren:children];
}

-(void)setChildren:(NSMutableArray *)children
{
objc_setAssociatedObject(self, kNodeKey, children, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

-(NSMutableArray *)children
{
return objc_getAssociatedObject(self, kNodeKey);
}

@end

示例用法
#import <Foundation/Foundation.h>

#import "NSObject+NodeCategory.h"

int main(int argc, const char * argv[])
{

@autoreleasepool {

NSObject *node = [NSObject new];
node.children = [NSMutableArray arrayWithArray:@[@"Kiwi Fruit", @"Apple", @"Bannana"]];
[node addNode:@"Dragon Fruit"];
NSLog(node.children.description);

}
return 0;
}

关于iphone - ios TreeView 组件的数据模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16057853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com