2

我在核心数据中有一个事件实体,其属性为 eventName、eventDate、eventLocation。我使用 SortDescriptors 作为 key eventDate。我在这里有一个问题,我需要设置位置首选项,我需要根据位置进行排序,而不是作为键值..例如,假设我将位置设置为“西雅图”,而不是所有具有西雅图位置的事件都应首先显示。您知道如何使用 FetchControllers 执行此操作..请在回答之前阅读问题

我不想

[NSSortDescriptor sortDescriptorWithKey:@"eventLocation" ascending:YES];

但类似的东西

[NSSortDescriptor sortDescriptorWithKey:@"eventLocation==Seattle" ascending:YES];

(这是错误的,我知道这是谓词格式)

4

1 回答 1

1

@sheetal,您的情况类似于iPhone中的电话应用程序,其中联系人按姓氏升序排序,但#必须出现在最后(Z下方)。换句话说,我们首先要 AB ... Z,然后是 #。

顺便说一句,# 代表那些以其他字符开头的姓氏,例如@myHome、133isACat、#puppy 等。要获取部分,我们可以创建一个名为 lastNameInitial 的新 Transient 属性并将其作为 SectionNameKeyPath 提供。如果 isLastNameNumeric(定义如下)为 YES,则分配 lastNameInitial = @"#"。否则,将 Last Name 的第一个字母,例如 A、B 等分配给 lastNameInitial。

如果我们在排序描述符数组中使用单个排序描述符,即基于姓氏升序的排序描述符,那么我们将在 A 之前以 # 开头。为了解决这个问题,我们可以定义一个名为 isLastNameNumeric (BOOL) 的瞬态属性,对于“常规”姓氏(以 AB ... Z 开头)为 0,对于所有其他姓氏(例如 @myHome)为 1。根据 isLastNameNumeric Ascending 创建一个单独的排序描述符,并将其作为数组中的第一个排序描述符。使姓氏升序排序描述符成为第二个排序描述符,它将根据姓氏进行子排序。

重申一下,基于 isLastNameNumeric Ascending 的排序描述符仅用作不可见的帮助器。

类似的解决方案将为您工作。但是,如果您的 eventLocation 可以更改(并不总是西雅图),那么实施此解决方案可能会比较棘手。

如果有人有更好的主意,无论是先显示 AB ... Z,然后是 #,还是对于 @sheetal 的情况,我都在听。

于 2014-02-18T11:08:13.377 回答