iOS搜索框的使用

1.搜索框的基本信息

搜索框的 “基本属性+代理方法+应用”参考如下链接

1.关于UISearchBar, 看这个就够了:https://www.jianshu.com/p/328330e88be6

2.属性、方法详解及应用(自定义搜索框样式):https://www.jianshu.com/p/7e49a1c656e7

3.改变搜索图标和占位符坐标:https://www.jianshu.com/p/0756aba082fc

4.导航栏上加搜索:https://www.jianshu.com/p/1a5d8bf6d906

  • 备注:做搜索的时候,记得搜索之前要先清空装数据的数组
清空数组

2.系统搜索框的demo演示

  • 效果图:
未搜索前
搜索后
  • 代码:
  • 核心代码之控件创建
- (UIView *)searchView {
    
    if (!_searchView) {
        
        _searchView = [[UIView alloc]init];
        [self.view addSubview:_searchView];
        _searchView.layer.borderColor = [UToColor backGrayColor].CGColor;
        _searchView.backgroundColor = [UToColor backWhiteColor];
        [_searchView mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.left.right.mas_equalTo(0);
            make.height.mas_equalTo(60);
            make.top.mas_equalTo(self.navView.mas_bottom).offset(0);
        }];
        
        _searchBar = [[UISearchBar alloc]init];
        [_searchView addSubview:_searchBar];
        [_searchBar mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.left.mas_equalTo(20);
            make.centerX.mas_equalTo(_searchView);
            make.height.mas_equalTo(40);
            make.centerY.mas_equalTo(_searchView);
        }];
        [_searchBar layoutIfNeeded];
        _searchBar.layer.cornerRadius = 20;
        _searchBar.layer.masksToBounds = YES;
        _searchBar.layer.borderWidth = 0.5;
        _searchBar.layer.borderColor = [UToColor separatelineGrayColor].CGColor;
        _searchBar.keyboardType = UIKeyboardAppearanceDefault;
        _searchBar.placeholder = @"请输入商品名称";
        _searchBar.delegate = self;
        _searchBar.barTintColor = [UToColor backGrayColor];//底部的颜色
        _searchBar.searchBarStyle = UISearchBarStyleDefault;
        _searchBar.barStyle = UIBarStyleDefault;
        
        UIView *line = [[UIView alloc]init];
        [_searchView addSubview:line];
        line.backgroundColor = [UToColor separatelineGrayColor];
        [line mas_makeConstraints:^(MASConstraintMaker *make) {
            
            make.left.right.mas_equalTo(0);
            make.height.mas_equalTo(0.7);
            make.bottom.mas_equalTo(-1);
        }];
    }
    return _searchView;
}
  • 核心代码之搜索代理相关方法
#pragma mark -- UISearchBarDelegate
//在搜索框中修改搜索内容时,自动触发下面的方法
- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar {
    
    return YES;
}

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    
    NSLog(@"开始输入搜索内容");
    searchBar.showsCancelButton = YES;//取消的字体颜色,
    [searchBar setShowsCancelButton:YES animated:YES];
    //改变取消的文本
    for(UIView *view in [[[searchBar subviews] objectAtIndex:0] subviews]) {
        
        if ([view isKindOfClass:[UIButton class]]) {
            
            UIButton *cancel =(UIButton *)view;
            [cancel setTitle:@"取消" forState:UIControlStateNormal];
            [cancel setTitleColor:[UIColor grayColor] forState:UIControlStateNormal];
        }
    }
}

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar {
    
    NSLog(@"输入搜索内容完毕");
    if (_searchBar.text.length<=0) {
        
        ///[self loadData];
        NSString *searchStr = _searchBar.text;
        NSDictionary *dic = @{@"token":[UToUser sharedUToUser].token,@"operate_type":@(4),@"client_id":_client_id?_client_id:@"",@"searchkey":searchStr,@"page":@(1)};
        SXUTONetWorkModel *model = [SXUTONetWorkModel UTONetWorkModelWithUTORequestType:SXUTORequestTypRuKuAllGoods parmeter:dic];
        if ([self.netWork request:model userToken:nil Identifier:@"SXUTORequestTypRuKuAllGoods"]) {
            
            self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
            self.hud.delegate = self;
        }
    }
}

//搜框中输入关键字的事件响应
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
    
    NSLog(@"输入的关键字是---%@---%lu",searchText,(unsigned long)searchText.length);
    //需要事先情况存放搜索结果的数组
    [self.resultArray removeAllObjects];
    //加个多线程,否则数量量大的时候,有明显的卡顿现象
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
    
    dispatch_async(globalQueue, ^{
        
        if (searchText!=nil && searchText.length>0) {
            
            //遍历需要搜索的所有内容,其中self.dataArray为存放总数据的数组
            for (UToStockSaveModel *model in self.dataArray) {///DataModel
                
                NSString *tempStr = model.goods_name;
                //----------->把所有的搜索结果转成成拼音
                NSString *pinyin = [self transformToPinyin:tempStr];
                NSLog(@"pinyin--%@",pinyin);
                
                if ([pinyin rangeOfString:searchText options:NSCaseInsensitiveSearch].length >0 ) {
                    //把搜索结果存放self.resultArray数组
                    [self.resultArray addObject:model];
                }
            }
        } else {
            
            self.resultArray = [NSMutableArray arrayWithArray:self.dataArray];
        }
        //回到主线程
        dispatch_async(dispatch_get_main_queue(), ^{
            
            [_tableView reloadData];
        });
    });
}

// 取消的响应事件
- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    
    NSLog(@"取消搜索");
    [searchBar setShowsCancelButton:NO animated:YES];
    [searchBar resignFirstResponder];
}

// 键盘上搜索事件的响应
- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar {
    
    NSLog(@"搜索");
    [self loadSearchListData];
    [searchBar setShowsCancelButton:NO animated:YES];
    [searchBar resignFirstResponder];
}

#pragma mark--获取汉字转成拼音字符串 通讯录模糊搜索 支持拼音检索 首字母 全拼 汉字 搜索
- (NSString *)transformToPinyin:(NSString *)aString {
    
    //转成了可变字符串
    NSMutableString *str = [NSMutableString stringWithString:aString];
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformMandarinLatin,NO);
    //再转换为不带声调的拼音
    CFStringTransform((CFMutableStringRef)str,NULL, kCFStringTransformStripDiacritics,NO);
    NSArray *pinyinArray = [str componentsSeparatedByString:@" "];
    NSMutableString *allString = [NSMutableString new];
    int count = 0;
    
    for (int  i = 0; i < pinyinArray.count; i++) {
        
        for(int i = 0; i < pinyinArray.count;i++) {
            
            if (i == count) {
                
                [allString appendString:@"#"];//区分第几个字母
            }
            [allString appendFormat:@"%@",pinyinArray[i]];
        }
        [allString appendString:@","];
        count ++;
    }
    
    NSMutableString *initialStr = [NSMutableString new];//拼音首字母
    for (NSString *s in pinyinArray) {
        
        if (s.length > 0) {
            
            [initialStr appendString:  [s substringToIndex:1]];
        }
    }
    [allString appendFormat:@"#%@",initialStr];
    [allString appendFormat:@",#%@",aString];
    return allString;
}

3.其他效果的搜索框

一般做搜索功能都会与后台约定,后台数据库进行模糊搜索设置。比如有城市选择:成都、成都市双流区。
1.精确搜索:是搜索成都则出现成都、搜索成都市双流区则出现成都市双流区,而搜索成的结果搜不出以上两个词
2.模糊搜索:是搜索成则出现与成有关的所有词,如果后台有设置拼音的,则输入个C就能出现有关C的所有词,如成都、成都市双流区

  • 1.简单实时搜索:
    Demo链接:https://pan.baidu.com/s/1reFD3pnE1GmWSKx7By0VHg
image.png
  • 2.点击搜索框导航栏上推效果;有实时搜索和点击搜索两种类型:
    Demo链接:https://pan.baidu.com/s/1E6LW0mwarp_FNXXu0-bUSw
  • 3.李库管实时搜索:
    Demo链接:https://pan.baidu.com/s/1wB_j3QRnpX2QQ40ZL-D1Vw

你可能感兴趣的:(iOS搜索框的使用)