2011-08-04 90 views
1

假设的NSArray有属于两类几个对象,与对象进行排序的NSArray

@interface FWNewsObj:NSObject 
{ 
    NSString *newsTitle; 
    NSDate *newsTime; 
} 
@end 




@interface FWPhotoObj:NSObject 
{ 
    NSString *photoTitle; 
    NSDate *photoTime; 
} 
@end 

我想在NSArray中与对象的标题(或时间)进行排序。但是每个类中的标题变量都有不同的名称。

那我该怎么办? 谢谢。

回答

1

你必须编写一个自定义比较方法,这两个类都可以实现。它必须把一个对象作为参数,并返回一个NSComparisonResultNSOrderedAscendingNSOrderedDescendingNSOrderedSame

然后,您可以使用sortedArrayUsingSelector:用自己的比较方法。

实施例:

在FWNewsObj:

- (NSComparisonResult)compareTitle:(id)obj 
{ 
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj); 
    if ([obj isKindOfClass:[FWPhotoObj class]]) { 
     return [newsTitle compare:[(FWPhotoObj *)obj photoTitle]]; 
    } else { 
     return [newsTitle compare:[(FWNewsObj *)obj newsTitle]]; 
    } 
} 

在FWPhotoObj:

- (NSComparisonResult)compareTitle:(id)obj 
{ 
    NSAssert([obj isKindOfClass:[FWNewsObj class]] || [obj isKindOfClass:[FWPhotoObj class]], @"Don't know how to compare %@ to %@", self, obj); 
    if ([obj isKindOfClass:[FWPhotoObj class]]) { 
     return [photoTitle compare:[(FWPhotoObj *)obj photoTitle]]; 
    } else { 
     return [photoTitle compare:[(FWNewsObj *)obj newsTitleTitle]]; 
    } 
} 

它实际上是比较容易在一个包装要么photoTitle或两个类只定义了一个标题的方法newsTitle。那么你可以使用NSSortDescriptortitle作为关键。

+0

两个类都实现了同一个选择的依据是什么?但是选择器的参数是类实例。然后它会导致崩溃,因为newsObj会调用FWPhotoObj的方法。或者可能是我错了,你可以说更多的细节和样本更好。 – scorpiozj

+0

我已经添加了一个例子。由于参数的类型为'id',它可以是FWPhotoObj或FWNewsObj(或任何其他),您必须根据其类来决定如何比较它。 – omz

+0

你是对的。我在类中设置了一个同名的属性。基本上这不是一个问题,因为我认为它可以通过课程设计来避免。 – scorpiozj

2

什么是瞬间来到我的脑海里是(如果我理解正确的Q):

  • 1日创建一个字典,用titleNames为键和值作为对象
  • 排序键阵列只会
  • 然后创建对象的排序阵列拉出的字典,在这个整理的键阵列