2015-07-07 4 views
0

У меня есть основной список приложений с двумя объектами Folder и Item с Я- многих отношениях, подкласс папка имеет функцию, называемую itemsArray(), которая возвращает товары в отсортированном массиве по creationDate, которые отображаются UITableView.Сортировка данных по нескольким ключевым значениям

Item имеет два свойства, называемые date типа NSDate и другого типа bool называется completed. Я создал функцию, где я могу пометить объект элемента ячейки как завершенный, который изменяет цвет текста ячейки на серый.

Есть ли способ, я могу также сортировать его по его завершенному значению? Например, значение completed значения true или false должно разделять все завершенные элементы, а затем сортировать их по creationDate.

Конечный результат должен быть в том случае, если завершенные элементы находятся в нижней части UITableView и в порядке их действия, а также незавершенные элементы соответствуют порядку даты. Как будто завершение имеет более высокий приоритет, чем дата, но все еще заказы от createDate

Heres my current function с дескриптором сортировки для возврата массива;

func itemsArray() -> [Item] { 
    let sortDescriptor = NSSortDescriptor(key: "creationDate", ascending: true) 
    return checklist.sortedArrayUsingDescriptors([sortDescriptor]) as! [Item] 
} 

PS: Я пробовал некоторые работы обходные, например, при разметке завершенным обновления даты, так что в нижней части. Это отделяет завершенные элементы с незавершенными. Но при снятии маркировки элемента он остается внизу, и это не очень хорошее долгосрочное решение, так как я могу изменить сортировку на алфавит и порядок.

ответ

2

Вы можете добавить еще NSSortDescriptor функции:

func itemsArray() -> [Item] { 
    let sortByCompleted = NSSortDescriptor(key: "completed", ascending: true) 
    let sortByCreationDate = NSSortDescriptor(key: "creationDate", ascending: true) 
    return checklist.sortedArrayUsingDescriptors([sortByCompleted, sortByCreationDate]) as! [Item] 
} 

Играть со значением ascending, чтобы получить true первый или false первый. Или Swifty способ делать вещи:

func itemsArray() -> [Item] { 
    return checklist.sort { 
     if $0.completed == $1.completed { 
      return $0.creationDate < $1.creationDate 
     } 
     return $0.completed < $1.completed 
    } 
} 
+0

Спасибо! Я очень ценю быстрый способ, я новичок в iOS и стараюсь ознакомиться с закрытием. Результаты были фактически разделены на три группы завершения, после чего я понял, что никогда не устанавливаю значение «false» при добавлении, поэтому элементы фактически имели значение по умолчанию nil, после того, как вы установили, что ваши методы отлично работают (Y) – RileyDev

+0

для sortDescriptors, посмотрите на http: //nshipster.com/nssortdescriptor/ – goggelj

Смежные вопросы