长期以来Windows开发人员,第一次使用Objective-C / iPhone开发人员想要创建NSArrays的NSDictionary,它可以在带有字母部分的普通UITableView中显示。
此数组字典的源代码是一个数组,其中包含按字母顺序排序的商店名称:
Apple Store
亚特兰大面包公司
边框
Build-A-Bear Workshop
嘉吉画廊
迪拉兹
迪克的体育用品
Eddie Baure
提箱
GameStop的
海兹堡钻石
LensCrafters亮
麦当劳
诺思通
Payless Shoe Source
陶器谷仓
冬至
星巴克咖啡
维多利亚的秘密
白谷仓蜡烛公司
从源创建的数组字典应该看起来像这样(括号中的数据类型):
Root(词典)
.... A(数组)
........ Apple Store(String)
........亚特兰大面包公司(String)
.... B(阵列)
........ Borders(String)
........ Build-A-Bear Workshop(String)
.... C(数组)
........嘉吉画廊(弦乐器)
.... D(数组)
........ Dillards(String)
........迪克的体育用品(弦)
....等等。
像上面结构这样的数组字典填充TableView并显示如下:
一个
Apple Store
亚特兰大面包公司
乙
边框
Build-A-Bear Workshop
ç
嘉吉画廊
d
迪拉兹
迪克的体育用品
等。
我编写的创建数组字典的代码最终将最后一个商店(White Barn Candle Co.)放在每个部分标题之后。
一个
白谷仓蜡烛公司
乙
白谷仓蜡烛公司
ç
白谷仓蜡烛公司
d
白谷仓蜡烛公司
等。
我意识到这种情况正在发生,因为我重用了一个临时数组,用A填充它,清除它,用B填充它,清除它等等。这是从源代码创建数组字典的实际代码阵列。
NSMutableDictionary *places = [[NSMutableDictionary alloc] init];
NSMutableArray *alphaPlace = [[NSMutableArray alloc] init];
for (int x = 1; x <= 26; x++) {
NSString *alphabet = [[NSString alloc] initWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
NSString *letter = [alphabet substringWithRange:NSMakeRange(x - 1, 1)];
for (NSString *place in allPlaces) {
NSString *first = [place substringWithRange:NSMakeRange(0, 1)];
if ([first isEqualToString:letter] == YES) { // Add to alphaPlace
[alphaPlace addObject:place];
}
else { // Add alphaPlace to places, clear out alphaPlace; add new item to alphaPlace
[places setValue:alphaPlace forKey:letter];
[alphaPlace removeAllObjects]; // SAME ARRAY BEING USED FOR ALL LETTERS OF ALPHABET!
[alphaPlace addObject:place];
}
}
}
我意识到我可以通过创建26个不同的数组并使用switch语句来选择要填充的正确数据来“暴力破解”,但我真的不想这样做。我认为更熟悉Objective-C的人可以为我提供更优雅的解决方案。
提前致谢。如果您需要更多信息,请告诉我。
答案 0 :(得分:11)
我想你想做这样的事情:
NSMutableDictionary *places = [[NSMutableDictionary alloc] init];
// initialize places with an array for each letter
NSString *alphabet = [[NSString alloc] initWithString:@"ABCDEFGHIJKLMNOPQRSTUVWXYZ"];
for (int x = 0; x < 26; x++) {
NSString *letter = [alphabet substringWithRange:NSMakeRange(x, 1)];
[places setObject:[NSMutableArray array] forKey:letter];
}
// then put each place in the array corresponding to its first letter
for (NSString *place in allPlaces) {
NSString *first = [[place substringWithRange:NSMakeRange(0, 1)] uppercaseString];
NSMutableArray *letterArray = [places objectForKey:first];
[letterArray addObject:place];
}