IOS 年的自动完成文本字段
Autocomplete textfield for years in IOS
我有一个文本字段,用户想在其中输入年份。我在文本字段下有 table视图,我已经在其中过了很多年。当用户输入年份时,table 视图应在 table 视图中显示数组中的年份列表,并且它应与数组中的前两个词相匹配。我试过一个代码,但它没有显示其中的年份数组。我的代码是这样的,
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSLog(@"Range:%@",NSStringFromRange(range));
NSLog(@"%@",textField.text);
NSString *passcode = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"%@",passcode);
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SELF CONTAINS %@",passcode];
year1Array = [year1Array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", year1Array);
if ([year1Array count]==0) {
_year01.hidden=true;
}else{
_year01.hidden = FALSE;
}
[_year01 reloadData];
return TRUE;
}
table查看代码是这样的,
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView==_year01) {
return [year1Array count];
}else{
return [year2Array count];
}
return YES;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if (tableView == _year01){
cell.textLabel.text=[year1Array objectAtIndex:indexPath.row];
}else{
cell.textLabel.text=[year2Array objectAtIndex:indexPath.row];
}
cell.backgroundColor=[UIColor grayColor];
cell.textLabel.textColor=[UIColor whiteColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *selectedCell=[tableView cellForRowAtIndexPath:indexPath];
if (tableView == _year01){
self.year1.text=[year1Array objectAtIndex:indexPath.row];
self.year01.hidden=YES;
}else{
self.year2.text=[year2Array objectAtIndex:indexPath.row];
self.year02.hidden=YES;
}
}
只需将 CONTAINS[cd]
更改为 NSPredicate
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", passcode];
已编辑:
你问我哪里错了
year1Array = [year1Array filteredArrayUsingPredicate:predicate];
您正在将过滤后的结果添加到 year1Array
您的主数组中,因此当您得不到结果时,表示 0 那么您的主数组也将为 0,这就是您面临此类问题的原因。
所以为Ex.取一个全局数组
@属性(非原子,强)NSMutableArray *temStaticArray;
将您的 year1Array 添加到 temStaticArray 只有一次喜欢。
[temStaticArray addObjectsFromArray:year1Array];
现在改变你在 shouldChangeCharactersInRange
中的逻辑
if (year1Array.count > 0){
[year1Array removeAllObjects];
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SELF CONTAINS %@",passcode];
year1Array = [temStaticArray filteredArrayUsingPredicate:predicate];
NSLog(@"%@", year1Array);
if ([year1Array count]==0) {
[year1Array addObjectsFromArray:temStaticArray];
_year01.hidden=true;
}else{
_year01.hidden = FALSE;
}
[_year01 reloadData];
我有一个文本字段,用户想在其中输入年份。我在文本字段下有 table视图,我已经在其中过了很多年。当用户输入年份时,table 视图应在 table 视图中显示数组中的年份列表,并且它应与数组中的前两个词相匹配。我试过一个代码,但它没有显示其中的年份数组。我的代码是这样的,
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
NSLog(@"Range:%@",NSStringFromRange(range));
NSLog(@"%@",textField.text);
NSString *passcode = [textField.text stringByReplacingCharactersInRange:range withString:string];
NSLog(@"%@",passcode);
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SELF CONTAINS %@",passcode];
year1Array = [year1Array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", year1Array);
if ([year1Array count]==0) {
_year01.hidden=true;
}else{
_year01.hidden = FALSE;
}
[_year01 reloadData];
return TRUE;
}
table查看代码是这样的,
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView==_year01) {
return [year1Array count];
}else{
return [year2Array count];
}
return YES;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
if (tableView == _year01){
cell.textLabel.text=[year1Array objectAtIndex:indexPath.row];
}else{
cell.textLabel.text=[year2Array objectAtIndex:indexPath.row];
}
cell.backgroundColor=[UIColor grayColor];
cell.textLabel.textColor=[UIColor whiteColor];
return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *selectedCell=[tableView cellForRowAtIndexPath:indexPath];
if (tableView == _year01){
self.year1.text=[year1Array objectAtIndex:indexPath.row];
self.year01.hidden=YES;
}else{
self.year2.text=[year2Array objectAtIndex:indexPath.row];
self.year02.hidden=YES;
}
}
只需将 CONTAINS[cd]
更改为 NSPredicate
NSPredicate * predicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", passcode];
已编辑:
你问我哪里错了
year1Array = [year1Array filteredArrayUsingPredicate:predicate];
您正在将过滤后的结果添加到 year1Array
您的主数组中,因此当您得不到结果时,表示 0 那么您的主数组也将为 0,这就是您面临此类问题的原因。
所以为Ex.取一个全局数组
@属性(非原子,强)NSMutableArray *temStaticArray;
将您的 year1Array 添加到 temStaticArray 只有一次喜欢。
[temStaticArray addObjectsFromArray:year1Array];
现在改变你在 shouldChangeCharactersInRange
if (year1Array.count > 0){
[year1Array removeAllObjects];
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"SELF CONTAINS %@",passcode];
year1Array = [temStaticArray filteredArrayUsingPredicate:predicate];
NSLog(@"%@", year1Array);
if ([year1Array count]==0) {
[year1Array addObjectsFromArray:temStaticArray];
_year01.hidden=true;
}else{
_year01.hidden = FALSE;
}
[_year01 reloadData];