将 NSDictionary 添加到 NSMutableArray 后访问密钥。 iOS
Posted
技术标签:
【中文标题】将 NSDictionary 添加到 NSMutableArray 后访问密钥。 iOS【英文标题】:Access Keys after adding NSDictionary to NSMutableArray. iOS 【发布时间】:2014-02-27 13:28:59 【问题描述】:我有一个 NSDictionary,我将它添加到一个可变数组中,但是当我尝试添加该数组来填充一个 uitableview 时,我得到了一个错误。
NSMutableArray *array = [[NSMutableArray alloc] init];
for (id element in self.categoriesMutableNameArray)
[array addObject:@"No"];
self.categoryDict = @ @"title" : self.categoriesMutableNameArray, @"selected" : array;
self.categoryArr = [[NSMutableArray alloc] init];
self.categoryMutableDict = [NSMutableDictionary dictionaryWithDictionary:self.categoryDict];
[self.categoryArr addObject:self.categoryDict];
下面的 categoryArr 是这样打印的:
2014-02-27 15:09:07.397 App[7982:70b] (
selected = (
No,
No,
No,
No,
No,
No,
No,
No,
No,
No,
No,
No,
No,
No
);
title = (
"Fashion - Women",
"Fashion - Men",
Kids,
"Accessories - Women",
"Accessories - Men",
"Styling / Hair",
Inspiration,
"Decoration / Architecture",
"Great Places",
"Art / Design",
"Music / Movie / Books",
"Food / Drink",
"Gadgets / Tech",
Rides
);
)
我遇到的问题是在 uitableview cellforrowatindexpath 方法中,我尝试添加 categoryArr 的标题键来填充 uitableview,我在这一行收到以下错误:
UILabel *categoryLabel = (UILabel *)[cell viewWithTag:111];
categoryLabel.text = [NSString stringWithFormat:@"%@",[[self.categoryArr objectAtIndex:indexPath.row] objectForKey:@"title"];
还有错误日志:
2014-02-27 15:24:33.804 App[8153:70b] -[__NSArrayM length]: unrecognized selector sent to instance 0xa9bc3a0
2014-02-27 15:24:33.807 App[8153:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM length]: unrecognized selector sent to instance 0xa9bc3a0'
*** First throw call stack:
(
0 CoreFoundation 0x020c75e4 __exceptionPreprocess + 180
1 libobjc.A.dylib 0x01e4a8b6 objc_exception_throw + 44
2 CoreFoundation 0x02164903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
3 CoreFoundation 0x020b790b ___forwarding___ + 1019
4 CoreFoundation 0x020b74ee _CF_forwarding_prep_0 + 14
5 Foundation 0x006e18ed -[NSConcreteMutableAttributedString replaceCharactersInRange:withString:] + 39
6 Foundation 0x006e255a -[NSConcreteMutableAttributedString initWithString:attributes:] + 293
7 UIKit 0x01172bc6 -[UILabel _setText:] + 97
8 UIKit 0x01172d84 -[UILabel setText:] + 40
9 App 0x00047ebd -[PiccImageCategoriesViewController tableView:cellForRowAtIndexPath:] + 1533
10 UIKit 0x010b461f -[UITableView _createPreparedCellForGlobalRow:withIndexPath:] + 412
11 UIKit 0x010b46f3 -[UITableView _createPreparedCellForGlobalRow:] + 69
12 UIKit 0x01098774 -[UITableView _updateVisibleCellsNow:] + 2378
13 UIKit 0x010abe95 -[UITableView layoutSubviews] + 213
14 UIKit 0x01030267 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
15 libobjc.A.dylib 0x01e5c81f -[NSObject performSelector:withObject:] + 70
16 QuartzCore 0x00c8e2ea -[CALayer layoutSublayers] + 148
17 QuartzCore 0x00c820d4 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
18 QuartzCore 0x00c81f40 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
19 QuartzCore 0x00be9ae6 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
20 QuartzCore 0x00beae71 _ZN2CA11Transaction6commitEv + 393
21 QuartzCore 0x00beb544 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
22 CoreFoundation 0x0208f4ce __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
23 CoreFoundation 0x0208f41f __CFRunLoopDoObservers + 399
24 CoreFoundation 0x0206d344 __CFRunLoopRun + 1076
25 CoreFoundation 0x0206cac3 CFRunLoopRunSpecific + 467
26 CoreFoundation 0x0206c8db CFRunLoopRunInMode + 123
27 GraphicsServices 0x027779e2 GSEventRunModal + 192
28 GraphicsServices 0x02777809 GSEventRun + 104
29 UIKit 0x00fc5d3b UIApplicationMain + 1225
30 App 0x0001406d main + 141
31 libdyld.dylib 0x02f4d70d start + 1
32 ??? 0x00000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
谢谢
【问题讨论】:
您使用 NSArray 来设置 UILabel.text 而不是传递 NSString。 这发生在第 1533 行。可能不是您突出显示的行。 我建议将您的数据结构更改为一个简单的字典数组(其中字典包含选择、标题、...键和值)。您当前的数据结构过于复杂。 我同意@Wain。你有一个数组字典的数组是有原因的吗?看起来它应该是一个数组字典,或者更好的是,一个字典数组。 您使用 NSArray 来设置 UILabel.text 而不是传递 NSString。 (我重复一遍,因为似乎没有人读过它。) 【参考方案1】:[[self.categoryArr objectAtIndex:indexPath.row] objectForKey:@"title"];
的返回是一个NSString的数组,categoryLabel.text = [NSString stringWithFormat:@"%@", /*the return array*/];
这就是问题所在。
也许你想要的是:
NSArray *categoryDetailArr = [[self.categoryArr objectAtIndex:indexPath.section] objectForKey:@"title"];
categoryLabel.text = [[categoryDetailArr objectAtIndex:indexPath.row];
【讨论】:
@JamieForrest - 解释如何正确?数组是怎么从stringWithFormat来的?【参考方案2】:写下这段代码
categoryLabel.text = [[[self.categoryArr objectAtIndex:0] objectForKey:@"title"]objectAtIndex:indexPath.row];
而不是
categoryLabel.text = [NSString stringWithFormat:@"%@",[[self.categoryArr objectAtIndex:indexPath.row] objectForKey:@"title"];
请检查 UITableView 数据源方法,即
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [categoryLabel objectAtIndex:0]valueForKey:@"selected"].count;
或
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return [categoryLabel objectAtIndex:0]valueForKey:@"title"].count;
【讨论】:
为什么?有解释的答案会更好 在这种情况下,有一个数组,其中有两个字典,每个字典都包含一个数组。他/她想在标签中显示这些标题..不需要使用stringWithFormat方法因为它会直接返回一个字符串..以上是关于将 NSDictionary 添加到 NSMutableArray 后访问密钥。 iOS的主要内容,如果未能解决你的问题,请参考以下文章
如何将 NSDictionary 数据添加到 NSMutableArray?
将 NSDictionary 添加到 NSMutableArray 后访问密钥。 iOS