gpt4 book ai didi

objective-c - 将 nil 值行始终排序到 nstableview 列的底部

转载 作者:行者123 更新时间:2023-12-03 16:48:24 26 4
gpt4 key购买 nike

我的应用程序中有一个包含多个列的 NSTableview。当我单击一个列标题以使其升序排序时,该列中具有零值的行将被排序在顶部,然后是非零值的行按升序排列。如果我重新单击同一列,首先会按降序显示非零值行,然后是零值行。

我想要做的是将零值行始终粘在底部。因此,首先应显示按升序或降序排序的非零值行,并将零值行保留在底部。如何才能最好地做到这一点?

据我了解,在此上下文中的排序是由 NSArrayControllerarrangedObject: 完成的。那么我应该继承 NSArrayController 并在 arrangedObjects: 方法中使用自定义排序算法,还是有更好的方法来获取上述结果?

最佳答案

我通过创建 NSSortDescriptor 的自定义子类在自己的应用程序中实现了这一点,这最终是 NSArrayController 用于执行排序的内容。实现如下,并不是很复杂,但请注意,它将空字符串与 nil 字符串一起排序到末尾。不幸的是,没有办法(至少据我所知)在 Interface Builder 中指定排序描述符子类,因此您必须手动创建一个排序描述符子类并在 awakeFromNib 方法中的相应 NSTableColumn 上调用 setSortDescriptorPrototype: 。

#define NULL_OBJECT(a) ((a) == nil || [(a) isEqual:[NSNull null]])

@interface MySortDescriptor : NSSortDescriptor {}
@end

@implementation MySortDescriptor

- (id)copyWithZone:(NSZone*)zone
{
return [[[self class] alloc] initWithKey:[self key] ascending:[self ascending] selector:[self selector]];
}

- (id)reversedSortDescriptor
{
return [[[[self class] alloc] initWithKey:[self key] ascending:![self ascending] selector:[self selector]] autorelease];
}

- (NSComparisonResult)compareObject:(id)object1 toObject:(id)object2
{
if (NULL_OBJECT([object1 valueForKeyPath:[self key]]) ||
[[object1 valueForKeyPath:[self key]] length] == 0)
return ([self ascending] ? NSOrderedDescending : NSOrderedAscending);
if (NULL_OBJECT([object2 valueForKeyPath:[self key]]) ||
[[object2 valueForKeyPath:[self key]] length] == 0)
return ([self ascending] ? NSOrderedAscending : NSOrderedDescending);
return [super compareObject:object1 toObject:object2];
}

@end

关于objective-c - 将 nil 值行始终排序到 nstableview 列的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3145288/

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