【问题标题】:Unable to delete items from UIPickerView based upon selection无法根据选择从 UIPickerView 中删除项目
【发布时间】:2025-12-03 15:30:01
【问题描述】:

所以,我有一个 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
  • 只有一列,所以我猜这只是一个组件。我不确定你所说的每一行的东西是什么意思。

标签: ios objective-c nsmutablearray uipickerview


【解决方案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 对象
  • 如果这个答案对您有帮助,请勾选它作为答案,如果没有,请详细说明问题
最近更新 更多