gpt4 book ai didi

cocoa - 子类化 NSArrayController 以限制排列对象的大小

转载 作者:行者123 更新时间:2023-12-03 16:22:40 25 4
gpt4 key购买 nike

我正在尝试限制数组 Controller 中的对象数量,但如果有必要,我仍然希望能够访问完整的数组。我想出的一个简单的解决方案是子类化 NSArrayController,并定义一个名为“limitedArrangedObjects”的新方法,该方法从真实的排列对象集中返回有限数量的对象。 (我见过 Limiting the number of objects in NSArrayController ,但这并不能解决我的问题。)

我希望可以通过绑定(bind)观察此属性,因此我在其上设置了对arrangedObjects 的依赖项。

问题是,当更新arrangedObjects时,limitedArrangedObjects似乎没有观察到arrangedObjects中的值变化。我已将 NSCollectionView 连接到 LimitedArrangedObjects,并且正在显示零个对象。 (如果我将它绑定(bind)到arrangedObjects,所有对象都会按预期显示。)

有什么问题吗?

相关代码如下:

@property (readonly) NSArray *limitedArrangedObjects;

- (NSArray *)limitedArrangedObjects;
{
NSArray *arrangedObjects = [super arrangedObjects];

NSUInteger upperLimit = 10000;

NSUInteger count = [arrangedObjects count];
if (count > upperLimit) count = upperLimit;
arrayToReturn = [arrangedObjects subarrayWithRange:NSMakeRange(0, count)];


return arrayToReturn;
}


+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key;
{
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];

if ([key isEqualToString:@"limitedArrangedObjects"]) {
NSSet *affectingKeys = [NSSet setWithObjects:@"arrangedObjects",nil];
keyPaths = [keyPaths setByAddingObjectsFromSet:affectingKeys];
}

return keyPaths;
}

最佳答案

我可能会采取不同的方法,即重写 -arrangeObjects:,它可以过滤掉对象,然后设置一个辅助属性,例如 completeArrangedObjects 来让您访问整个数组。它看起来像这样:

- (NSArray*)arrangeObjects:(NSArray*)originalObjects
{
NSArray* arrayToReturn;
NSUInteger upperLimit = 10000;

NSUInteger count = [originalObjects count];
if (count > upperLimit) count = upperLimit;
arrayToReturn = [arrangedObjects subarrayWithRange:NSMakeRange(0, count)];
[self setCompleteArrangedObjects:originalObjects];
return arrayToReturn;
}

然后,您只需将 NSCollectionView 绑定(bind)到 arrangedObjects,并且由于您使用的是 completeArrangedObjects 的 setter,因此如果您愿意,也应该在适当的时候触发 KVO 通知也绑定(bind)到它。

关于cocoa - 子类化 NSArrayController 以限制排列对象的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2785662/

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