`
JA_lin
  • 浏览: 10760 次
社区版块
存档分类
最新评论

类QQ,微信,联系人列表搜索UISearchBar使用

 
阅读更多
最近在写一个联系人模块的搜索联系人的功能,废话不多少,直接上图:

下面再贴一下自己的关键代码
1,设置代理,UISearchBarDelegate,UISearchDisplayDelegate
<span style="font-size:12px;">@interface FKRSearchBarTableViewController () <UITableViewDataSource, UITableViewDelegate,
UISearchBarDelegate, UISearchDisplayDelegate> {
    NSMutableArray * resultItems;
    NSMutableArray * suggestItems;
}
@property(nonatomic, strong, readwrite) UISearchBar *searchBar;
@property(nonatomic, strong) UISearchDisplayController *strongSearchDisplayController;</span>
2,ViewDidLoad方法 初始化
- (void)viewDidLoad
{
    [super viewDidLoad];
    resultItems = [[NSMutableArray alloc] initWithCapacity:20];
    suggestItems = [[NSMutableArray alloc] initWithCapacity:20];
   //1,初始化searchbar
    self.searchBar = [[UISearchBar alloc] init];
    self.searchBar.placeholder = @"Search";
    self.searchBar.delegate = self;
    [_searchBar setAutocapitalizationType:UITextAutocapitalizationTypeNone];  //默认是句子首字母大写,这里设置为none
    [self.searchBar sizeToFit];
    //2,初始化tableview,并将searbar设置为tableview的tableHeaderView
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    self.tableView.tableHeaderView=_searchBar;
    [self.view addSubview:_tableView];
    //3.初始化SearchDisplayController
    self.strongSearchDisplayController = [[UISearchDisplayController alloc]
                                          initWithSearchBar:self.searchBar contentsController:self];
    self.searchDisplayController.searchResultsDataSource = self;
    self.searchDisplayController.searchResultsDelegate = self;
    self.searchDisplayController.delegate = self;
    //4.设置搜索栏默认数据,即全部联系人
    [self fetchItems];
}
3,代理方法设置
(1)代理方法1:当search文本内容改变的时候调用

业务处理如下:当文本内容长度大于零,根据文本内容搜索,否则查询所有。代码如下:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
   if ([self.searchBar.text length] > 0) {
        [self doSearch];
    } else {
        [self fetchMembers];
        [self setionWithFriends];
        [self.tableView reloadData];
    }
}
(2)代理方法2:点击取消按钮时候调用

业务如下:点击取消按钮的时候,重置响应者,清空搜索文本内容,tableview加载全部联系人,代码如下:

<span style="font-size:12px;">- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    //重置响应者
    [self.searchBar resignFirstResponder];
    // 清空搜索文本
    self.searchBar.text = @"";
    // 隐藏取消按钮
    self.searchBar.showsCancelButton = NO;
    // 加载默认数据
    [self fetchMembers];
    [self setionWithFriends];
    [self.tableView reloadData];
}</span>
(3)代理方法3:文本开始编辑的时候调用,显示取消按钮,代码如下:

<span style="font-size:12px;">- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    self.searchBar.showsCancelButton = YES;
}</span>

4,tableview最常用的三个代理方法的设置

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

注:判断tableview 是否是searchDisplayController的searchResultsTableView

   <span style="font-size:12px;"> if(tableView == self.searchDisplayController.searchResultsTableView){
     }else{
     }</span>

最后给大家看下又长又臭的代码,我已经不忍直视了。

<span style="font-size:14px;">- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if(tableView == self.searchDisplayController.searchResultsTableView){
        return 1;
    }else{
        if (self.showSectionIndexes) {
            return self.sections.count;     
        } else {
            return 1;
        }
    }
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //if (section<1)return 1;
     if(tableView == self.searchDisplayController.searchResultsTableView)
     {
         return [suggestItems count];
     }else{
         //分组排序
         if (self.showSectionIndexes) {
             return [[self.sections objectAtIndex:section] count];  
             //显示全部
         } else {
             return self.friendArray.count;
         }
     }
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kFKRSearchBarTableViewControllerDefaultTableViewCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kFKRSearchBarTableViewControllerDefaultTableViewCellIdentifier];
    }
    if(tableView == self.searchDisplayController.searchResultsTableView){
        for(UIView * elem in [cell.contentView subviews])
        {
            if([elem isKindOfClass:[BDSuggestLabel class]])
            {
                NSLog(@"remove");
                [elem removeFromSuperview];
            }
        }
        BDSuggestLabel * richTextLabel = [[BDSuggestLabel alloc] initWithFrame:CGRectMake(10, 10, 300, 25)];
        richTextLabel.text = [suggestItems objectAtIndex:indexPath.row];
        richTextLabel.keyWord = self.searchBar.text;//设置当前搜索的关键字
        richTextLabel.backgroundColor = [UIColor clearColor];
        richTextLabel.font = [UIFont systemFontOfSize:17.0f];
        richTextLabel.textColor = [UIColor grayColor];
        [cell.contentView addSubview:richTextLabel];
    } else {
        //显示分组
        if (self.showSectionIndexes) {
            if (indexPath.section<1) {
                //cell.textLabel.text=@"xxoo";
                AddressFirstCell *cell=[[[NSBundle mainBundle]loadNibNamed:@"AddressFirstCell" owner:self options:nil]lastObject];
                cell.blok=^(int button){               
                    switch (button) {
                        case 0:
                            [self.navigationController pushViewController:self.colleague animated:YES];
                            break;
                        case 1:
                            [self.navigationController pushViewController:self.dept animated:YES];
                            break;
                        case 2:
                            [self.navigationController pushViewController:self.common animated:YES];
                            break;
                        default:
                            break;
                    }           
                };
                return cell;
            }else{
                //cell.textLabel.text = [[self.sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
                JAMember *member= [[self.sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
                cell.textLabel.text=member.name;
                DLog(@"%@",cell.textLabel.text);
                if([member.memberDetail.image length]>0){
                    NSData * imageData = [NSData dataWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:member.memberDetail.image]];
                    cell.imageView.image=[UIImage imageWithData:imageData];
                }
            }
            //显示全部
        } else {
            cell.textLabel.text = [self.friendArray objectAtIndex:indexPath.row];
        }
    }
        return cell;
}</span>




第一次写博客,目的是记录自己的学习经历,大神请轻喷,又原意一起交流的可以加个好友,后续我会把代码再整理下,再贴出源代码

最近在写一个联系人模块的搜索联系人的功能,废话不多少,直接上图:

下面再贴一下自己的关键代码
1,设置代理,UISearchBarDelegate,UISearchDisplayDelegate
<span style="font-size:12px;">@interface FKRSearchBarTableViewController () <UITableViewDataSource, UITableViewDelegate,
UISearchBarDelegate, UISearchDisplayDelegate> {
    NSMutableArray * resultItems;
    NSMutableArray * suggestItems;
}
@property(nonatomic, strong, readwrite) UISearchBar *searchBar;
@property(nonatomic, strong) UISearchDisplayController *strongSearchDisplayController;</span>
2,ViewDidLoad方法 初始化
- (void)viewDidLoad
{
    [super viewDidLoad];
    resultItems = [[NSMutableArray alloc] initWithCapacity:20];
    suggestItems = [[NSMutableArray alloc] initWithCapacity:20];
   //1,初始化searchbar
    self.searchBar = [[UISearchBar alloc] init];
    self.searchBar.placeholder = @"Search";
    self.searchBar.delegate = self;
    [_searchBar setAutocapitalizationType:UITextAutocapitalizationTypeNone];  //默认是句子首字母大写,这里设置为none
    [self.searchBar sizeToFit];
    //2,初始化tableview,并将searbar设置为tableview的tableHeaderView
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds];
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    self.tableView.tableHeaderView=_searchBar;
    [self.view addSubview:_tableView];
    //3.初始化SearchDisplayController
    self.strongSearchDisplayController = [[UISearchDisplayController alloc]
                                          initWithSearchBar:self.searchBar contentsController:self];
    self.searchDisplayController.searchResultsDataSource = self;
    self.searchDisplayController.searchResultsDelegate = self;
    self.searchDisplayController.delegate = self;
    //4.设置搜索栏默认数据,即全部联系人
    [self fetchItems];
}
3,代理方法设置
(1)代理方法1:当search文本内容改变的时候调用

业务处理如下:当文本内容长度大于零,根据文本内容搜索,否则查询所有。代码如下:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText {
   if ([self.searchBar.text length] > 0) {
        [self doSearch];
    } else {
        [self fetchMembers];
        [self setionWithFriends];
        [self.tableView reloadData];
    }
}
(2)代理方法2:点击取消按钮时候调用

业务如下:点击取消按钮的时候,重置响应者,清空搜索文本内容,tableview加载全部联系人,代码如下:

<span style="font-size:12px;">- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar {
    //重置响应者
    [self.searchBar resignFirstResponder];
    // 清空搜索文本
    self.searchBar.text = @"";
    // 隐藏取消按钮
    self.searchBar.showsCancelButton = NO;
    // 加载默认数据
    [self fetchMembers];
    [self setionWithFriends];
    [self.tableView reloadData];
}</span>
(3)代理方法3:文本开始编辑的时候调用,显示取消按钮,代码如下:

<span style="font-size:12px;">- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar {
    self.searchBar.showsCancelButton = YES;
}</span>

4,tableview最常用的三个代理方法的设置

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

注:判断tableview 是否是searchDisplayController的searchResultsTableView

   <span style="font-size:12px;"> if(tableView == self.searchDisplayController.searchResultsTableView){
     }else{
     }</span>

最后给大家看下又长又臭的代码,我已经不忍直视了。

<span style="font-size:14px;">- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    if(tableView == self.searchDisplayController.searchResultsTableView){
        return 1;
    }else{
        if (self.showSectionIndexes) {
            return self.sections.count;     
        } else {
            return 1;
        }
    }
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //if (section<1)return 1;
     if(tableView == self.searchDisplayController.searchResultsTableView)
     {
         return [suggestItems count];
     }else{
         //分组排序
         if (self.showSectionIndexes) {
             return [[self.sections objectAtIndex:section] count];  
             //显示全部
         } else {
             return self.friendArray.count;
         }
     }
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kFKRSearchBarTableViewControllerDefaultTableViewCellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kFKRSearchBarTableViewControllerDefaultTableViewCellIdentifier];
    }
    if(tableView == self.searchDisplayController.searchResultsTableView){
        for(UIView * elem in [cell.contentView subviews])
        {
            if([elem isKindOfClass:[BDSuggestLabel class]])
            {
                NSLog(@"remove");
                [elem removeFromSuperview];
            }
        }
        BDSuggestLabel * richTextLabel = [[BDSuggestLabel alloc] initWithFrame:CGRectMake(10, 10, 300, 25)];
        richTextLabel.text = [suggestItems objectAtIndex:indexPath.row];
        richTextLabel.keyWord = self.searchBar.text;//设置当前搜索的关键字
        richTextLabel.backgroundColor = [UIColor clearColor];
        richTextLabel.font = [UIFont systemFontOfSize:17.0f];
        richTextLabel.textColor = [UIColor grayColor];
        [cell.contentView addSubview:richTextLabel];
    } else {
        //显示分组
        if (self.showSectionIndexes) {
            if (indexPath.section<1) {
                //cell.textLabel.text=@"xxoo";
                AddressFirstCell *cell=[[[NSBundle mainBundle]loadNibNamed:@"AddressFirstCell" owner:self options:nil]lastObject];
                cell.blok=^(int button){               
                    switch (button) {
                        case 0:
                            [self.navigationController pushViewController:self.colleague animated:YES];
                            break;
                        case 1:
                            [self.navigationController pushViewController:self.dept animated:YES];
                            break;
                        case 2:
                            [self.navigationController pushViewController:self.common animated:YES];
                            break;
                        default:
                            break;
                    }           
                };
                return cell;
            }else{
                //cell.textLabel.text = [[self.sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
                JAMember *member= [[self.sections objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
                cell.textLabel.text=member.name;
                DLog(@"%@",cell.textLabel.text);
                if([member.memberDetail.image length]>0){
                    NSData * imageData = [NSData dataWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:member.memberDetail.image]];
                    cell.imageView.image=[UIImage imageWithData:imageData];
                }
            }
            //显示全部
        } else {
            cell.textLabel.text = [self.friendArray objectAtIndex:indexPath.row];
        }
    }
        return cell;
}</span>




第一次写博客,目的是记录自己的学习经历,大神请轻喷,又原意一起交流的可以加个好友,后续我会把代码再整理下,再贴出源代码

分享到:
评论

相关推荐

    仿写QQ 微信 联系人 列表Demo

    4. **数据展示**:联系人列表通常使用列表视图(如iOS的UITableView或Android的RecyclerView)来展示。每个联系人项需要包含姓名、头像、以及可能的其他信息(如昵称、状态等)。为了提高性能,列表视图的复用机制...

    类似微信联系人的ListView

    在微信应用中,当我们查看联系人列表时,会发现它具有很好的可滚动性、分组和搜索功能,这种设计模式被称为“类似微信联系人的ListView”。同样,城市列表的ListView也是类似的,主要目的是高效地展示大量结构化的...

    仿QQ微信小程序源码.zip

    源码可能使用了微信小程序或QQ小程序所支持的开发框架,如微信的微信开发者工具所采用的WXML和WXSS语言,以及JavaScript进行业务逻辑处理。 【标签】: 同样是"仿QQ微信小程序源码.zip",标签进一步确认了压缩包内容...

    QQ微信电脑版客户端下载

    QQ微信现在可以说是每部智能机安装必备软件了!已经突破2亿用户,覆盖iOS,Andriod、Windows Phone、Symbain、黑莓等...黄天不负有心人哪~终于找到一款无需任何虚拟机就可以安装使用的QQ微信电脑客户端了,分享给大家。

    用QT QListView写的仿微信好友列表

    用QT QListView写的仿微信好友列表,列表仿微信好友列表(头像+上下双行数据),还有单击获取信息的功能;效果图在 https://blog.csdn.net/u014385680/article/details/104963956

    一键删除QQ微信记录文件.bat

    批处理删除QQ和微信聊天记录 强制关闭QQ、微信并删除QQ、微信所有聊天记录和接收的文件 批处理删除QQ和微信聊天记录

    基于Android的仿QQ微信聊天系统 (2).zip

    【压缩包子文件的文件名称列表】: "基于Android的仿QQ微信聊天系统" 暗示压缩包可能包含以下内容: - 项目源代码:包括Java文件、XML布局文件、资源文件(如图片、音频、字符串资源等) - 项目配置文件:如build....

    QQ微信域名防封处理技术源码 微信网址域名强制跳转至浏览器打开 红域名打开访问

    QQ微信域名防封处理技术源码 微信网址域名强制跳转至浏览器打开 红域名打开访问 1已被拦截的红域名,通过此源码可以实现不提示拦截,直接在微信内打开。 2无需跳转到浏览器,也能打开 3修复打开失败,跳转卡顿的问题...

    qq与微信分享

    本文将深入探讨如何使用封装好的PopupWindow类实现QQ、QQ空间以及微信和朋友圈的分享功能。 首先,PopupWindow是Android系统提供的一种轻量级窗口,它可以作为弹出框显示在屏幕上的任意位置。在实现分享功能时,...

    基于Android的仿QQ微信聊天系统

    6. **UI设计**:遵循Android Material Design指南,提供良好的用户体验,包括聊天界面、联系人列表和消息通知。 7. **数据存储**:本地存储聊天记录,可以利用SQLite数据库或者Android的SharedPreferences来保存用户...

    一键删除QQ微信记录文件(多路径).bat

    一键删除QQ微信记录文件(多路径).bat

    营销QQ微信版产品介绍

    介绍腾讯营销QQ微信版新增加功能,微信营销功能展示

    【微信小程序-毕设期末大作业】源码电商类微信小程序

    【微信小程序-毕设期末大作业】源码电商类微信小程序 【微信小程序-毕设期末大作业】源码电商类微信小程序【微信小程序-毕设期末大作业】源码电商类微信小程序【微信小程序-毕设期末大作业】源码电商类微信小程序...

    微信小程序-模仿QQ小程序

    本项目“微信小程序-模仿QQ小程序”旨在通过模仿QQ小程序的界面和功能,帮助开发者学习和掌握微信小程序的开发技巧。 首先,我们需要了解微信小程序的基本结构。微信小程序由JSON、WXML、WXSS和JavaScript四部分...

    2022最新版本微信QQ防封遮罩跳转页面PHP源码美化版

    浏览器跳转原理就是,用户微信,QQ内访问提示浏览器打开,非微信QQ访问可直接打开。不会有任何提示,对用户没有任何影响,网址跳转到浏览器打开,也就不会再存在封域名和屏蔽域名的可能。 做营销最怕的就是自己的...

    防红专用 QQ微信打开提示跳转浏览器的代码

    使用方法: 1、上传fanghong目录至网站根目录。 2、将本目录"代码,记得修改!.php"代码全部复制到网站根目录下index.php的开头。 3、复制前请先修改本站名字、链接 替换成 自己的网站名字、链接。 批量替换...

    仿QQ 微信 聊天界面 发送表情

    这通常包括输入框、表情选择面板、联系人列表、消息气泡等元素。UI设计应遵循平台的原生设计规范,以确保一致性。 2. **表情库**:QQ和微信都有自己丰富的表情库,包括系统默认的表情和用户自定义的表情。开发者...

    swift-通过qq和微信的官方文档实现qq的登录和分享已经微信的登录与分享

    在Swift开发中,集成第三方社交平台如QQ和微信,能够为用户提供更加便捷的登录和分享功能,提升用户体验。本文将详细讲解如何根据QQ和微信的官方文档,实现这两个平台的登录与分享功能。 首先,我们需要在Xcode项目...

    微信QQ防洪文件,微信QQ浏览器打开提示源码

    1. **浏览器内核解析**:微信QQ浏览器可能使用的是自家定制的内核,如X5内核,了解这部分源码可以帮助我们理解它是如何解析和渲染网页内容的。 2. **安全策略实施**:源码中可能包含了防止洪水攻击的算法,比如IP...

    Android实现QQ和微信分享功能

    在Android应用开发中,集成社交平台的分享功能已经成为一种常见的需求,尤其是QQ和微信作为国内最流行的社交软件,其分享接口被广泛使用。本篇文章将详细介绍如何在Android应用中实现QQ和微信的分享功能。 首先,...

Global site tag (gtag.js) - Google Analytics