更新 UIPickerView 中的内容
Posted
技术标签:
【中文标题】更新 UIPickerView 中的内容【英文标题】:Update content in UIPickerView 【发布时间】:2015-01-16 21:00:17 【问题描述】:我有一个 pickerView,我希望它在用户每次选择新行时更新。我有 2 个数组:1 个用于第一个组件 - “categorie”,另一个用于第二个组件 - “subCat”。然后我有一个 MutableArray,我在 'didSelectRow' 中添加对象 - “sub”。
将对象添加到“sub”后,我将其放入 NSLog 中,它会输出我期望的结果。问题是当我将“sub”添加到“subCat”,然后更新选择器视图时,它给了我一个错误。
(当我注释掉“subCat = [[NSArray arrayWithArray:sub];”时,它完美无缺。)
如你所知,我是初学者,所以请不要对我太苛刻。
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
return 2;
- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
if (component == 0)
return [categorie count];
else
return [subCat count];
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
if (component == 0)
return categorie[row];
else
return subCat[row];
- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
subCat = [[NSArray alloc] init];
sub = [[NSMutableArray alloc] init];
for (id key in values)
if ([key isEqualToString:rowSelection])
[sub addObject:[values valueForKey:key]];
subCat = [NSArray arrayWithArray:sub];
[self.pickerView reloadAllComponents];
错误:
-[__NSArrayI length]: unrecognized selector sent to instance 0x7febfbd7d9b0
2015-01-16 12:32:06.163 MyApp[1254:34938] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI length]: unrecognized selector sent to instance 0x7febfbd7d9b0'
【问题讨论】:
你是如何声明和初始化sub
的?
sub = [[NSMutableArray alloc] init]; for (id key in values) if ([key isEqualToString:@"Key"]) [sub addObject:[values valueForKey:key]];
既然您发布了该代码,我收回我所说的话。顺便说一句 - 用该代码更新您的问题。在评论中阅读太难了。
该错误似乎表明您的 sub
数组包含数组而不是字符串。这意味着您的字典值是数组。
你是对的。我的字典值是数组。这很糟糕吗?
【参考方案1】:
这两行是一个问题,但它们不一定是导致崩溃的原因:
subCat = [[NSArray alloc] init]; // Here you have created a new array.
subCat = [NSArray arrayWithArray:sub]; // Here you replace that new array you created with another new array.
这种结构可能不是你想要的:
sub = [[NSMutableArray alloc] init];
for (id key in values)
if ([key isEqualToString:@"Key"])
[sub addObject:[values valueForKey:key]];
操作上与此相同:
[sub addObject:values[@"Key"]];
根据您看到的错误,您存储在sub
中的对象实际上是NSArray
,您稍后会在其上调用length
。相反,试试这个:
sub = values[@"Key"];
或
[sub addObjectsFromArray:values[@"Key"]];
【讨论】:
@"Key" 是什么意思? key 是一个 id,而不是一个字符串? 你是那个调用isEqualToString
(来自NSString
的方法)的人。我只是跟随你的领导。我不确定 Objective-C 中的 id
是否意味着您认为的意思。以上是关于更新 UIPickerView 中的内容的主要内容,如果未能解决你的问题,请参考以下文章
当 uitableviewcell 中 uipickerview 的值发生变化时,我需要更新 viewcontroller 中的标签