Превращение NSArray пользовательских объектов в UITableView в алфавитном порядке с индексом? - PullRequest
0 голосов
/ 26 октября 2010

(хм .. длинное название)

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

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

.. и т.д ..

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

                                                               A
                                                               B
                                                               C

EDIT

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

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

На самом деле, возможно, подойдет только вложенный массив.

Ответы [ 2 ]

3 голосов
/ 26 октября 2010

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

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];
}

Не проверено ...

0 голосов
/ 02 июля 2013

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

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

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

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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...