Как использовать первый символ в качестве имени раздела

Для меня преимущество динамических языков состоит в том, сколько еще читаемый код становится из-за меньше кода и функциональные методы как блок Ruby и понимание списка Python.

, Но тогда я вид мисс время компиляции, проверяя (опечатка действительно происходит), и IDE, автоматический завершенный. В целом, меньший объем кода и удобочитаемость окупаются для меня.

Другое преимущество обычно интерпретировано/не, скомпилировал природа языка. Измените некоторый код и сразу посмотрите результат. Это - действительно средство экономии времени во время разработки.

Наконец, что не менее важно, мне нравится то, что можно разжечь консоль и испытать что-то, что Вы не уверены в, как класс или метод, который Вы никогда не использовали прежде и видите, как это ведет себя. Существует много использования для консоли, и я просто оставлю это для Вас для выяснения.

38
задан nevan king 16 November 2009 в 10:33
поделиться

2 ответа

Вы должны просто передать "name" в качестве sectionNameKeyPath. См. Этот ответ на вопрос «Базовые данные UITableView с индексированием».

ОБНОВЛЕНИЕ
Это решение работает только в том случае, если вам нужен только быстрый скроллер заголовка индекса. В этом случае вы НЕ будете отображать заголовки разделов. См. Ниже образец кода.

В остальном, я согласен с refulgentis, что временное свойство - лучшее решение. Кроме того, при создании NSFetchedResultsController sectionNameKeyPath имеет следующее ограничение:

Если этот путь ключа не совпадает с то, что указано первой сортировкой дескриптор в fetchRequest, они должны генерировать такие же относительные порядки. Например, первый дескриптор сортировки в fetchRequest может указывать ключ для постоянного свойства; sectionNameKeyPath может указывать ключ для переходного свойства, полученного из постоянное свойство.

Шаблонные реализации UITableViewDataSource с использованием NSFetchedResultsController:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [[fetchedResultsController sections] count];
}

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [fetchedResultsController sectionIndexTitles];
}

- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index {
    return [fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

// Don't implement this since each "name" is its own section:
//- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
//    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
//    return [sectionInfo name];
//}

ОБНОВЛЕНИЕ 2

Для нового временного свойства 'uppercaseFirstLetterOfName' добавьте новый строковый атрибут к применимой сущности в модели и установите флажок «переходный».

Есть несколько способов реализовать получатель. Если вы генерируете / создаете подклассы, вы можете добавить его в файл реализации подкласса (.m).

В противном случае вы можете создать категорию в NSManagedObject (я поместил это прямо в верхней части файла реализации моего контроллера представления, но вы можете разделить его между собственным заголовком и собственным файлом реализации):

@interface NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName;
@end

@implementation NSManagedObject (FirstLetter)
- (NSString *)uppercaseFirstLetterOfName {
    [self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
    NSString *aString = [[self valueForKey:@"name"] uppercaseString];

    // support UTF-16:
    NSString *stringToReturn = [aString substringWithRange:[aString rangeOfComposedCharacterSequenceAtIndex:0]];

    // OR no UTF-16 support:
    //NSString *stringToReturn = [aString substringToIndex:1];

    [self didAccessValueForKey:@"uppercaseFirstLetterOfName"];
    return stringToReturn;
}
@end

Кроме того, в этой версии не забудьте передать 'uppercaseFirstLetterOfName' в качестве sectionNameKeyPath:

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext
sectionNameKeyPath:@"uppercaseFirstLetterOfName" // this key defines the sections
cacheName:@"Root"];

И, чтобы раскомментировать tableView : titleForHeaderInSection: в реализации UITableViewDataSource:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo name];
}
79
ответ дан 27 November 2019 в 03:16
поделиться

Может быть более элегантный способ сделать это, но недавно я столкнулся с той же проблемой и придумал это решение.

Во-первых, я определил переходное свойство для объектов, которыми я был индексирование вызвало firstLetterOfName и записало получатель в файл .m для объекта. ex

- (NSString *)uppercaseFirstLetterOfName {
    [self willAccessValueForKey:@"uppercaseFirstLetterOfName"];
    NSString *stringToReturn = [[self.name uppercaseString] substringToIndex:1];
    [self didAccessValueForKey:@"uppercaseFirstLetterOfName"];
    return stringToReturn;
}

Затем я настроил свой запрос / объекты на выборку для использования этого свойства.

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Object" inManagedObjectContext:dataContext];
[request setEntity:entity];
[NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES selector:@selector(caseInsensitiveCompare:)];
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
[request setSortDescriptors:sortDescriptors];

Замечание по поводу ничего: будьте осторожны с NSFetchedResultsController - он еще не полностью готов, ИМХО, и любая ситуация, выходящая за рамки перечисленных простых случаев в документации, вам, вероятно, будет лучше сделать это «старомодным» способом.

11
ответ дан 27 November 2019 в 03:16
поделиться