无法根据选择从 UIPickerView 中删除项目

Posted

技术标签:

【中文标题】无法根据选择从 UIPickerView 中删除项目【英文标题】:Unable to delete items from UIPickerView based upon selection 【发布时间】:2014-04-18 22:27:06 【问题描述】:

所以,我有一个 UIPicker 视图,只要输入不是“NULL”,它就会从 NSMutableArray 填充。

所以我的选择器显示了除 NULL 之外的所有值。

现在,我有一个 UITextField 框和一个按钮。因此,无论我在文本字段中键入什么,然后单击按钮,如果它与 NSMutableArray 中的任何内容(用于填充 UIPickerView )匹配,它将其设置为 NULL 并刷新 UIPicker 以便它不会不再显示。

由于某种原因,我可以将值设置为 NULL(使用 NSLog 检查),但选择器永远不会得到更新,NSMutable 数组也不会。

-(void) loadthepicker


    NSMutableArray *getarray = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"FilerNamesArray"]];


    pickerLoaderArray=[[NSMutableArray alloc] init];



    for (int j=0; j<20; j++) 



        if ([[getarray objectAtIndex:j] isEqualToString:@"NULL"])
        
            // do nothing..don't load


        
        else   // add that filter to pickerLoaderArray
        

            [pickerLoaderArray addObject:[getarray objectAtIndex:j]];



        



     // end of for




    [pickerView reloadAllComponents];

    [pickerView selectRow:0 inComponent:0 animated:NO];



-(NSInteger)numberOfComponentsInPickerView:(NSInteger)component

    return 1;


-(NSInteger)pickerView:(UIPickerView *)picker numberOfRowsInComponent:(NSInteger)component


    return [pickerLoaderArray count];



-(NSString *)pickerView:(UIPickerView *)picker titleForRow:(NSInteger)row forComponent:(NSInteger)component

    return [pickerLoaderArray objectAtIndex:row];
    

按钮:

- (IBAction)deleteButton:(id)sender 

    NSUserDefaults *CheckFiltersUsed = [NSUserDefaults standardUserDefaults];
    NSInteger myInt = [CheckFiltersUsed integerForKey:@"FiltersUsed"];

    if (myInt<=20 && myInt>0) 


        NSLog(@"number of filters used before deleting %ld",(long)myInt);
        [CheckFiltersUsed setInteger:myInt-1 forKey:@"FiltersUsed"];
        [CheckFiltersUsed synchronize];

        // get names array
        NSMutableArray *getarray = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"FilerNamesArray"]];
        NSArray *get=getarray;


        // at location where name matches with selectedfilter..put NULL
        for (int j=0; j<20; j++) 

            if (    [[getarray objectAtIndex:j] isEqualToString:_filterToDelete.text]    && isFilterDeleted==NO )
            

                NSLog(@"------currently %d is %@",j,[getarray objectAtIndex:j]);
                [getarray insertObject:@"NULL" atIndex:j];
                NSLog(@"------now %d is %@",j,[getarray objectAtIndex:j]);

                UIAlertView *alert = [[UIAlertView alloc] initWithTitle: @"" message: @"Deleted" delegate: nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; [alert show];

                isFilterDeleted=YES;

                [[NSUserDefaults standardUserDefaults] setObject:getarray forKey:@"FilerNamesArray"];
                [[NSUserDefaults standardUserDefaults]synchronize];

                 [self loadthepicker];

            

            else
            


                NSLog(@"No matching filter name");

            


         // end of for

        //now save this array back.


    

    else
    

        NSUserDefaults *CheckFiltersUsed = [NSUserDefaults standardUserDefaults];
        NSInteger myInt = [CheckFiltersUsed integerForKey:@"FiltersUsed"];
        NSLog(@"Wrong number of filters!!!... %d",myInt);

    


【问题讨论】:

每个组件的每一行都必须有 something 只有一列,所以我猜这只是一个组件。我不确定你所说的每一行的东西是什么意思。 【参考方案1】:

如果我得到你想要做的事情,你想从数组和选择器中删除相等的字符串。但是,您只需将另一个 NSString 对象插入索引 'j'

在deleteButton方法中:

代替这一行

[getarray insertObject:@"NULL" atIndex:j];

打电话

[getarray removeObjectAtIndex:j];

**更新

在 loadPicker 中只需删除 if 语句以检查字符串是否等于 @"NULL"

所以而不是:

for (int j=0; j<20; j++) 
    if ([[getarray objectAtIndex:j] isEqualToString:@"NULL"])
    
        // do nothing..don't load
    
    else   // add that filter to pickerLoaderArray
    
        [pickerLoaderArray addObject:[getarray objectAtIndex:j]];
    

做:

for(NSString *pickerValue in getarray)
    [pickerLoaderArray addObject:pickerValue];

【讨论】:

但是选择器加载了除NULL之外的所有值,所以这个空值会显示在里面。 确保它将加载除 NULL 之外的所有值,因为当执行此行时 [[getarray objectAtIndex:j] isEqualToString:@"NULL"] 您忽略所有值为 @"NULL" 的 NSString 对象 如果这个答案对您有帮助,请勾选它作为答案,如果没有,请详细说明问题

以上是关于无法根据选择从 UIPickerView 中删除项目的主要内容,如果未能解决你的问题,请参考以下文章

UIPickerView,无法从数组中获取数据

Objective C如何根据其他数组项从数组中删除项

无法根据 UIPickerview 中第一个组件中的值重新加载第二个组件

无法从 UIToolbar 退出 UIPickerview

从 Apple iPhone SDK 中的 UIPickerview 选择数据时如何显示图像

根据第一个组件选择在 UIPickerView 第二个组件中显示数据