无法根据选择从 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 中第一个组件中的值重新加载第二个组件