Мое требование: у меня есть это прямо вперед требование перечисления имен людей в алфавитном порядке в виде индексированного представления таблицы с заголовками индекса является начальной буквой алфавитов (дополнительно значок поиска вверху и #, чтобы отображать разные значения, начинающиеся с числа и других специальных символов).iPhone контакты приложение
То, что я сделал до сих пор: 1. Я использую основные данные для хранения и «last_name» моделируются как свойство Струнного в контактах объекте 2.I я с помощью NSFetchedResultsController для отображения отсортированных индексируется табличный вид.
Вопросы совершающие мои требования: 1. Во-первых, я не мог получить названия индексных раздел, чтобы быть первой буквой алфавита. Предложение Дейва в следующем посте помогло мне добиться того же: NSFetchedResultsController with sections created by first letter of a string
Единственная проблема, с которой я столкнулся с предложением Дейва, заключается в том, что я не мог получить разницу по имени, сгруппированную под индексом «#».
То, что я пробовал: 1. Я попытался добавить обычай сравнивать метод NSString (категории), чтобы проверить, как производится сравнение и раздел, но что пользовательский метод не дозвонились, когда это указано в селекторе NSSortDescriptor ,
Вот код:
@interface NSString (SortString)
-(NSComparisonResult) customCompare: (NSString*) aStirng;
@end
@implementation NSString (SortString)
-(NSComparisonResult) customCompare:(NSString *)aString
{
NSLog(@"Custom compare called to compare : %@ and %@",self,aString);
return [self caseInsensitiveCompare:aString];
}
@end
код для извлечения данных:
NSArray *sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"last_name"
ascending:YES selector:@selector(customCompare:)] autorelease]];
[fetchRequest setSortDescriptors:sortDescriptors];
fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext sectionNameKeyPath:@"lastNameInitial" cacheName:@"MyCache"];
Можете ли вы дайте мне знать, что мне не хватает, и как требование может быть выполнено?
Hi Alex, Спасибо за вашу помощь. Вышеприведенный код действительно работает. Но выведенные контрольные секции не ожидали. Например, если было два значения фамилии, которые были прочитаны 111 и 222, в таблице было два раздела (один для 1, а другой для 2). Чтобы обойти эту проблему и сгруппировать ее под «#», я добавил # к именам, начинающимся с числа, сохраняя в основных данных. Если бы это имя начиналось с # в средстве рендеринга таблицы, нужно было бы удалить его. Я уверен, что это не простой способ сделать это. Есть ли лучший способ справиться с этим с помощью контроллера получаемых результатов? – KSH
Кроме того, раздел # отображается вверху над «A» (из-за порядка сортировки, указанного для выбранного контроллера результатов). Но приложение контактов по умолчанию отображает # в нижней части, что тоже актуально. Можно ли добиться этого с помощью получаемого контроллера результатов? Или нам нужно передать всю логику управления различными массивами? Я предпочитаю выбранный контроллер результатов для управления памятью и простоты использования. – KSH
Обновление: я добавил еще один числовой столбец, чтобы указать, начиналось ли последнее имя с помощью алфавита или нет, и сначала отсортировано по нему, а затем отсортировано снова в столбце с фамилией. то есть. два дескриптора сортировки, которые дали соответствующие результаты (я также нажал # в нижней части индекса). Пока работает нормально, но что, если приложение локализовано на каком-то другом языке? Как проверить, является ли данная начальная буква имени частью стандартной кодировки и доступна в индексе (при условии, что индекс локализован). – KSH