长期的 Windows 开发人员,第一次 Objective-C/iPhone 开发人员想要创建一个 NSArrays 的 NSDictionary,可以在带有字母部分的普通 UITableView 中显示。
这个数组字典的来源是一个包含按字母顺序排序的商店名称的数组:
Apple Store
Atlanta Bread Company
Borders
Build-A-Bear Workshop
Cargill Gallery
Dillards
Dick's Sporting Goods
Eddie Baure
FootLocker
GameStop
Heizberg Diamonds
LensCrafters
McDonald's
Nordstrom
Payless Shoe Source
Pottery Barn
Solstice
Starbucks Coffee
Victoria's Secret
White Barn Candle Co.
从源创建的数组字典应如下所示(括号中的数据类型):
Root(字典)
..A(数组)
........Apple Store(字符串)
........Atlanta Bread Company(字符串)
....B(数组)
... .....Borders (String)
....Build-A-Bear Workshop (String)
....C (Array)
....Cargill Gallery (String)
... .D (Array)
........Dillards (String)
....Dick's Sporting Goods (String)
....etc.
类似上述结构的数组字典填充 TableView 并显示如下:
A
Apple Store
Atlanta Bread Company
B
Borders
Build-A-Bear Workshop
C
Cargill Gallery
D
Dillards
Dick's Sporting Goods
等
我编写的创建数组字典的代码最终将最后一个商店(White Barn Candle Co.)放在每个节标题之后。
A
White Barn Candle Co.
B
White Barn Candle Co.
C
White Barn Candle Co.
D
White Barn Candle Co.
等
我意识到这种情况正在发生,因为我重用了一个临时数组,用 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 的人可以为我提供更优雅的解决方案。
提前致谢。如果您需要更多信息,请告诉我。