繁体   English   中英

将自定义对象的NSArray转换为带有索引的按字母顺序划分的UITableView?

[英]Turning an NSArray of custom objects into a alphabetically sectioned UITableView with an index?

(嗯..长标题)

如果我从这样一个自定义对象(每个对象是一个Person)的NSArray开始:

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

..等等..

您可以看到该数组已经按照姓氏顺序排列。 我如何使用该数组来创建一个UITableView,其中包含标题A,BC等,以及垂直运行的一侧的索引对象

                                                               A
                                                               B
                                                               C

编辑

我想我想问的是如何将我的对象数组转换为带有姓氏的所有首字母的Section 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];
}

未经测试...

约瑟夫·图拉(Joseph Tura)的答案有很多问题,正如他提到的那样,未经测试。 这里是问题:

1)如果名称为nil或@“”,则[aPerson.name substringWithRange:aRange]将会崩溃;

2)如果firstLetter已经在键列表中,则当前数组不会重置为指向属于键firstLetter的数组对象。 因此,如果currentArray先前指向字典中键为“ K”的数组,而当前的firstLetter为键“ P”,则将添加名称(以字母“ P”开头)到以“ k”开头的名称数组。 那里的大问题。

3)由于大小写不同(对大写字母和小写字母'k'进行了不同对待),因此将Jassie添加到了不同的数组中。

因此,作为对约瑟夫答案的巨大改进,第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;
}

可以添加其他改进,例如删除前导空格等,但我只是想提到主要问题。 我对这些问题测试了约瑟夫的答案,然后通过我的研究来确保将其消除:)。 干杯。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM