gpt4 book ai didi

objective-c - NSOutlineView数据源不允许扩展

转载 作者:行者123 更新时间:2023-12-03 17:36:08 24 4
gpt4 key购买 nike

我有一个 NSOutlineView,我试图将模型对象数组作为数据源加载到其中。

特别是,模型对象以及一堆顶级属性(如标题等)有一个 BOOLEAN NSNumber 指示它们是否有子项(isRoute),以及一个实际包含所述子项的数组属性项目(事实上,它们是同一模型类的实例)。

@interface RoadModel : NSObject {

NSString *_id;
NSString *roadmapID;
NSString *routeID;

NSString *title;
NSString *description;
NSNumber *collapsed;
NSNumber *isRoute;
NSString *staff;
NSNumber *start;

NSArray *staffList;
NSMutableArray *updates;
NSMutableArray *uploads;
NSMutableArray *children;
NSNumber *childrenCount;

}

@property (nonatomic, copy) NSString *_id;
@property (nonatomic, copy) NSString *roadmapID;
@property (nonatomic, copy) NSString *routeID;

@property (nonatomic, copy) NSString *title;
@property (nonatomic, copy) NSString *description;
@property (nonatomic, copy) NSNumber *collapsed;
@property (nonatomic, copy) NSNumber *isRoute;
@property (nonatomic, copy) NSString *staff;
@property (nonatomic, copy) NSNumber *start;

@property (nonatomic, copy) NSArray *staffList;
@property (nonatomic, copy) NSMutableArray *updates;
@property (nonatomic, copy) NSMutableArray *uploads;
@property (nonatomic, copy) NSMutableArray *children;
@property (nonatomic, copy) NSNumber *childrenCount;

- (id)initWithJSONObject:(NSDictionary *)JSONObject;

这是模型对象的接口(interface)。

现在,在一个特定的 View Controller 中,我实例化一个 NSOutlineView 并在 init 方法中使用这些对象的数组设置它的数据源(根 = 道路)。这是数据源的实现。

@implementation RoadOutlineViewDataSource

- (id)initWithRoads:(NSArray *)roads {

if (self = [super init])
root = roads;

return self;

}

- (NSInteger)outlineView:(NSOutlineView *)outlineView numberOfChildrenOfItem:(id)item {

if (item == nil)
return [root count];

else {
NSLog(@"ROUTE HAS CHILDREN");
return [[item childrenCount] intValue];
}
return 0;
}

- (BOOL)outlineView:(NSOutlineView *)outlineView isItemExpandable:(id)item
{
if (item == nil)
return YES;

return [[item isRoute] boolValue];

}

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index ofItem:(id)item {

if (item == nil) {
return [root objectAtIndex:index];
} else {
return [((RoadModel *)item).children objectAtIndex:index];
}
return nil;
}

- (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item {

return [item title];

}

@end

现在,我遇到的问题是第二种方法,其中数据源尝试找出每个项目有多少个子项,但对于根数组仅被调用一次。它甚至不会尝试查询根中的每个模型项,因此我得到的是每个模型对象的一行,但那些本来可以扩展的项目却不是。

作为一个兴趣点,我实现了一个委托(delegate)方法,它以不同的方式绘制“可扩展”行,并且工作得很好。但是,此实现中的某些内容导致数据源不询问每个项目是否有子项,因此我无法扩展那些要扩展的项目。我不知道为什么!我遵循了苹果文档和大量在线资源,但不断遇到同样的问题。任何建议将不胜感激。谢谢大家。

编辑:

这是我设置 OutlineView 的方法

NSOutlineView *outlineView = [[NSOutlineView alloc] initWithFrame:self.frame];
NSTableColumn *titleColumn = [[NSTableColumn alloc] initWithIdentifier:@"title"];
[titleColumn setWidth:self.frame.size.width];
[outlineView addTableColumn:titleColumn];
[outlineView setRowHeight:22.0f];
[outlineView setIndentationPerLevel:5.0];
[outlineView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleSourceList];
[outlineView setUsesAlternatingRowBackgroundColors:YES];
[outlineView setGridStyleMask:NSTableViewDashedHorizontalGridLineMask];
[scrollView setDocumentView:outlineView];
RoadOutlineViewDelegate *delegate = [[RoadOutlineViewDelegate alloc] init];
RoadOutlineViewDataSource *dataSource = [[[RoadOutlineViewDataSource alloc] initWithRoads:roads] retain];
[outlineView setDataSource:dataSource];
[outlineView setDelegate:delegate];
[outlineView reloadData];

最佳答案

我认为问题出在您的 -outlineView:isItemExpandable: 委托(delegate)方法上。这也会为您的根对象调用,因此如果传递给此方法的项为 nil,您需要返回 YES

此外,您的数据源是否故意维护对roads数组的弱引用?如果没有,那么“roads”将被释放,因为您没有将其保留在 -init 方法中。

关于objective-c - NSOutlineView数据源不允许扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6481501/

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