Поворот NSArray пользовательских объектов в алфавитном разрезе UITableView с индексом?

(hmm .. длинный название)

Если я начну с NSArray пользовательских объектов (каждый объект – Person), как это:

{ surname:Allen forename: Woody, surname:Baxter forename: Stanley, surname:Clay forename: Cassius } 

..и т.д..

Вы можете видеть, что массив уже находится в порядке фамилии. Как использовать этот массив для создания aa UITableView с заголовками разделов A, BC и т. Д., А также с индексированием на стороне, которая работает вертикально

  A B C 

РЕДАКТИРОВАТЬ

Я предполагаю, что я спрашиваю, как превратить мой массив объектов в массив разделов со всеми первыми буквами Surnames и Array Surname Array, который, возможно, является вложенным массивом, подобным этому:

 { letter: a { surname:Allen forename: Woody } letter: b { surname:Baxter forename: Stanley } etc } 

Фактически, возможно, только вложенный массив будет делать.

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

 NSMutableDictionary *aIndexDictionary = [[NSMutableDictionary alloc] init]; NSMutableArray *currentArray; NSRange aRange = NSMakeRange(0, 1); NSString *firstLetter; for (Person *aPerson in personArray) { firstLetter = [aPerson.surname substringWithRange:aRange]; if ([aIndexDictionary objectForKey:firstLetter] == nil) { currentArray = [NSMutableArray array]; [aIndexDictionary setObject:currentArray forKey:firstLetter]; } [currentArray addObject:aPerson]; } 

Непроверенные …

Ответ Джозефа Туры имеет ряд проблем, и он непроверен, как он упоминал. Вот вопросы:

1) [aPerson.name substringWithRange: aRange] выйдет из строя, если имя равно nil или @ "";

2) Если firstLetter уже находится в списке ключей, текущий массив не сбрасывается, чтобы указать на объект массива, который принадлежит первому элементу keyLetter. Поэтому, если currentArray ранее указывал на массив, ключ которого в словаре – «K», и все же текущий firstLetter будет «P», уже существующим в качестве ключа, будет добавлено имя (начинающееся с буквы «P») к массиву имен, начинающихся с 'k'. Там большой вопрос.

3) Jassie добавляется к разному массиву к jassie в результате разницы в случае (в верхнем и нижнем регистре «k» обрабатываются по-разному).

Таким образом, в качестве огромного улучшения для ответа Джозефа точка № 2 является критической, вот более точная реализация для будущих пользователей:

 -(NSDictionary*)indexArrayByName:(NSArray*)people { NSMutableDictionary *anIndexedDict = [[NSMutableDictionary alloc] init]; NSMutableArray *currentArray = nil; NSRange aRange = NSMakeRange(0, 1); NSString *firstLetter; for(Person *aPerson in people) { if(aPerson.name.length) firstLetter = [[aPerson.name substringWithRange:aRange] uppercaseString]; else firstLetter = @"noName";//find own way to identify these if(![anIndexedDict.allKeys containsObject:firstLetter]) { currentArray = [NSMutableArray array]; anIndexedDict[firstLetter] = currentArray; } currentArray = anIndexedDict[firstLetter]; [currentArray addObject:aPerson]; } return anIndexedDict; } 

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

  • динамически размер высоты элементов tableView
  • Сортировка NSDictionary от JSON для UITableView
  • UIScrollView - установить отрицательный контентОфис, когда начинается анимация отскока
  • uitableview: вложенные заголовки разделов
  • Метод делегата willDisplayCell Swift
  • Перезагрузите данные табличного представления без очистки состояния выбора
  • Как реализовать страницу комментариев с новостями, аналогичную Facebook или Instagram
  • Использование пользовательского изображения для аксессуара UITableViewCell и его ответ на UITableViewDelegate
  • Swift - Как получить числовые значения для выбранных строк в UITableview
  • Получить индексную таблицу UITextField в UITableViewCell с помощью Swift
  • Дважды заполняющая решетка Firebase - Swift
  • Interesting Posts
    Давайте будем гением компьютера.