更新 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 中的标签

UIPickerView 选择的第一个组件决定第二个组件的内容不同步

如何更改 UIPickerView 中的背景颜色?

UIPickerView 中的 JSON 数组按父标签排序

ios中uipickerview中的弧度显示可以设置吗

更新 UIPickerView 行数