Для меня преимущество динамических языков состоит в том, сколько еще читаемый код становится из-за меньше кода и функциональные методы как блок Ruby и понимание списка Python.
, Но тогда я вид мисс время компиляции, проверяя (опечатка действительно происходит), и IDE, автоматический завершенный. В целом, меньший объем кода и удобочитаемость окупаются для меня.
Другое преимущество обычно интерпретировано/не, скомпилировал природа языка. Измените некоторый код и сразу посмотрите результат. Это - действительно средство экономии времени во время разработки.
Наконец, что не менее важно, мне нравится то, что можно разжечь консоль и испытать что-то, что Вы не уверены в, как класс или метод, который Вы никогда не использовали прежде и видите, как это ведет себя. Существует много использования для консоли, и я просто оставлю это для Вас для выяснения.
Вы должны просто передать "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];
}
Может быть более элегантный способ сделать это, но недавно я столкнулся с той же проблемой и придумал это решение.
Во-первых, я определил переходное свойство для объектов, которыми я был индексирование вызвало 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 - он еще не полностью готов, ИМХО, и любая ситуация, выходящая за рамки перечисленных простых случаев в документации, вам, вероятно, будет лучше сделать это «старомодным» способом.