iOS开发——UISearchController实现搜索栏功能|阳和移动开发

      原文链接 http://www.mobile-open.com/2015/86290.html,有删节和改动。

      原文主要讲述了如何使用UISearchController实现搜索栏,现在把实现思路和代码整理出来分享给iOS程序猿,希望给大家的开发工作带来帮助。再次感谢原作者。

      UISearchController 继承自UIViewController     // 在iOS 8.0以上版本中, 我们可以使用UISearchController来非常方便地在UITableView中添加搜索框. 而在之前版本中, 我们还是必须使用UISearchBar + UISearchDisplayController的组合方式.

#import SearchViewController.h
#define kTableCell @tablecell
@interface SearchViewController ()
@property(nonatomic,retain)NSMutableArray *items;
@property(nonatomic,retain)UISearchController *searchController;
@property(nonatomic,retain)NSMutableArray *searchResults;//接收数据源结果
@end
懒加载及释放
- (instancetype)init
{
    self = [super init];
    if (self) {
        }
    return self;
}
//懒加载
- (NSMutableArray *)items{
    if (!_items) {
        self.items = [NSMutableArray arrayWithCapacity:0];
    }
    return [[_items retain]autorelease];
}
//懒加载
- (NSMutableArray *)searchResults{
    if (!_searchResults) {
        self.searchResults = [NSMutableArray arrayWithCapacity:0];
    }
    return [[_searchResults retain]autorelease];
}
//释放
- (void)dealloc
{
    self.items = nil;
    self.searchResults = nil;
    self.searchController = nil;
    [super dealloc];
}
调用:

- (void)viewDidLoad {
    [super viewDidLoad];
    //导航栏
    [self p_navigationController];

    //调用初始化searchController
    [self setSearchControllerView];

    //注册
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kTableCell];

}
初始化SearchController初始化

- (void)setSearchControllerView{
    self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
    self.searchController.searchBar.frame = CGRectMake(0, 0, 0, 44);
    self.searchController.dimsBackgroundDuringPresentation = false;
    //搜索栏表头视图
    self.tableView.tableHeaderView = self.searchController.searchBar;
    [self.searchController.searchBar sizeToFit];
//背景颜色
    self.searchController.searchBar.backgroundColor = [UIColor orangeColor];
    self.searchController.searchResultsUpdater = self;

}

引入UISearchController之后, UITableView的内容也要做相应地变动: 即cell中要呈现的内容是items, 还是searchResults.这一点, 可以通过UISearchController的active属性来判断, 即判断输入框是否处于active状态.

UITableView相关的很多方法都要根据active来做判断:

配置导航条

- (void)p_navigationController{
    self.title = @小韩哥-英雄列表;
    self.items = @[@国服第一臭豆腐 No.1 Stinky Tofu CN.,
                   @比尔吉沃特(Bill Ji walter),
                   @瓦洛兰 Valoran,
                   @祖安 Zaun,
                   @德玛西亚 Demacia,
                   @诺克萨斯 Noxus,
                   @艾欧尼亚 Ionia,
                   @皮尔特沃夫 Piltover,
                   @弗雷尔卓德 Freijord,
                   @班德尔城 Bandle City,
                   @无畏先锋,
                   @战争学院 The Institute of War,
                   @巨神峰,
                   @雷瑟守备(JustThunder),
                   @裁决之地(JustRule),
                   @黑色玫瑰(Black Rose),
                   @暗影岛(Shadow island),
                   @钢铁烈阳(Steel fierce),
                   @恕瑞玛沙漠 Shurima Desert,
                   @均衡教派(Balanced sect),
                   @水晶之痕(Crystal Scar),
                   @影流(Shadow Flow ),
                   @守望之海(The Watchtower of sea),
                   @皮尔特沃夫,
                   @征服之海,
                   @扭曲丛林 Twisted Treeline,
                   @教育网专区,
                   @试炼之地 Proving Grounds,
                   @卡拉曼达 Kalamanda,
                   @蓝焰岛 Blue Flame Island,
                   @哀嚎沼泽 Howling Marsh,
                   @艾卡西亚 Icathia,
                   @铁脊山脉 Ironspike Mountains,
                   @库莽古丛林 Kumungu,
                   @洛克法 Lokfar,
                   @摩根小道 Morgon Pass,
                   @塔尔贡山脉 Mountain Targon,
                   @瘟疫丛林 Plague Jungles,
                   @盘蛇河 Serpentine River,
                   @厄尔提斯坦 Urtistan,
                   @巫毒之地 Voodoo Lands,
                   @咆哮深渊 Howling Abyss,
                   @熔岩洞窟 Magma Chambers,
                   @召唤师峡谷 Summoner's Rift,
                   @九尾妖狐: 阿狸(Ahri),
                   @暗影之拳:阿卡丽(Akali),
                   @牛头酋长:阿利斯塔(Alistar),
                   @殇之木乃伊:阿木木(Amumu),
                   @冰晶凤凰:艾尼维亚(Anivia),
                   @黑暗之女:安妮(Annie),
                   @寒冰射手:艾希(Ashe),
                   @蒸汽机器人:布里茨(Blitzcrank),
                   @复仇焰魂:布兰德(Brand),
                   @皮城女警:凯特琳(Caitlyn),
                   @魔蛇之拥:卡西奥佩娅(Cassiopeia),
                   @虚空恐惧:科’加斯(ChoGath),
                   @英勇投弹手:库奇(Corki),
                   @诺克萨斯之手:德莱厄斯(Darius),
                   @皎月女神:黛安娜:(Diana),
                   @祖安狂人:蒙多医生(DrMundo),
                   @荣耀行刑官:德莱文(Delevin),
                   @蜘蛛女皇:伊莉斯(Elise),
                   @寡妇制造者:伊芙琳(Evelynn),
                   @探险家:伊泽瑞尔(Ezreal),
                   @末日使者:费德提克(Fiddlesticks),
                   @无双剑姬:剑姬(Fiora),
                   @潮汐海灵:菲兹(Fizz),
                   @哨兵之殇:加里奥(Galio),
                   @海洋之灾:普朗克(Gangplank),
                   @德玛西亚之力:盖伦(Garen),
                   @酒桶:古拉加斯(Gragas),
                   @法外狂徒:格雷福斯(Graves),
                   @战争之影:赫卡里姆 (Hecarim),
                   @大发明家:黑默丁格(Heimerdinger),
                   @刀锋意志:伊瑞利亚(Irelia),
                   @风暴之怒:迦娜(Janna),
                   @德玛西亚皇子:嘉文四世(JarvanⅣ),
                   @武器大师:贾克斯(Jax),
                   @未来守护者:杰斯(Jayce),
                   @天启者:卡尔玛(Karma),
                   @死亡颂唱者:卡尔萨斯(Karthus),
                   @虚空行者:卡萨丁(Kassadin),
                   @不详之刃:卡特琳娜(Katarina),
                   @审判天使:凯尔(Kayle),
                   @狂暴之心:凯南(Kennen),
                   @虚空掠夺者:卡’兹克(Khazix),
                   @深渊巨口:克格’莫(Kog Maw),
                   @诡术妖姬:乐芙兰(LeBlanc),
                   @盲僧:李青(Lee sin),
                   @曙光女神:蕾欧娜(Leona),
                   @仙灵女巫:璐璐(lulu),
                   @光辉女郎:拉克丝(Lux),
                   @熔岩巨兽:墨菲特(Malphite),
                   @虚空先知:玛尔扎哈(Malzahar),
                   @扭曲树精:茂凯(Maokai),
                   @无极剑圣:易(Yi),
                   @赏金猎人:厄运小姐(MissFortune),
                   @齐天大圣:孙悟空(Monkey king),
                   @金属大师:莫德凯撒(Mordekaiser),
                   @堕天使:莫甘娜(Morgana),
                   @唤潮鲛姬:娜美(Nami),
                   @沙漠死神:内瑟斯(Nasus),
                   @深海泰坦:诺提勒斯(Nautilus),
                   @狂野女猎手:奈德丽(Nidalee),
                   @永恒梦魇:魔腾(Nocturne),
                   @雪人骑士:努努(Nunu),
                   @狂战士:奥拉夫(Olaf),
                   @发条魔灵:奥莉安娜(Orianna),
                   @战争之王:潘森(Pantheon),
                   @钢铁大使:波比(Poopy),
                   @披甲龙龟:拉莫斯(Rammus),
                   @荒漠屠夫:雷克顿(Renekton),
                   @傲之追猎者:雷恩加尔(Rengar),
                   @放逐之刃:瑞文(Rivan),
                   @机械公敌:兰博(Rumble),
                   @流浪法师:瑞兹(Ryze),
                   @凛冬之怒:瑟庄妮:(Sejuani),
                   @恶魔小丑:萨科(Shaco),
                   @暮光之眼:慎(Shen),
                   @龙血武姬:希瓦娜(Shyvana),
                   @炼金术士:辛吉德(Singed),
                   @亡灵勇士:赛恩(Sion),
                   @战争女神:希维尔(Sivir),
                   @水晶先锋:斯卡纳(Skarner),
                   @琴瑟仙女:娑娜(Sona),
                   @众星之子:索拉卡(Soraka),
                   @策士统领:斯维因(Swain),
                   @暗黑元首:辛德拉(Syndra),
                   @刀锋之影:泰隆(Talon),
                   @宝石骑士:塔里克(Taric),
                   @迅捷斥候:提莫(Teemo),
                   @魂锁典狱长:锤石(Thresh),
                   @麦林炮手:崔丝塔娜(Tristana),
                   @诅咒巨魔:特兰德尔(Trundle),
                   @蛮族之王:泰达米尔(Tryndamere),
                   @卡牌大师:崔斯特(Twisted Fate),
                   @瘟疫之源:图奇(Twitch),
                   @野兽之灵:乌迪尔(Udyr),
                   @首领之傲:厄加特(Urgot),
                   @惩戒之箭:韦鲁斯(Varus),
                   @暗夜猎手:薇恩(Vayne),
                   @邪恶小法师:维伽(Veigar),
                   @皮城执法官:蔚(Vi),
                   @机械先驱:维克托(Viktor),
                   @猩红收割者:弗拉基米尔(Vladimir),
                   @雷霆咆哮:沃利贝尔(Volibear),
                   @嗜血猎手:沃里克(Warwick),
                   @远古巫灵:泽拉斯(Xerath),
                   @德邦总管:赵信(XinZhao),
                   @掘墓者:约里克(Yorick),
                   @影流之主:劫(Zed),
                   @爆破鬼才:吉格斯(Ziggs),
                   @时光守护者:基兰(Zilean),
                   @荆棘之兴:婕拉(Zyra)].mutableCopy;
}

#pragma mark 协议中的方法

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController{

    [self.searchResults removeAllObjects];
    //NSPredicate 谓词
    NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@self contains[cd] %@,searchController.searchBar.text];
    self.searchResults = [[self.items filteredArrayUsingPredicate:searchPredicate]mutableCopy];
    //刷新表格
    [self.tableView reloadData];

}
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    // Return the number of sections.
    return 1;
}

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

    return (!self.searchController.active) ? self.items.count : self.searchResults.count;
}
返回cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableCell forIndexPath:indexPath];

    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:kTableCell];
    }

    if (indexPath.row > 0) {
        cell.imageView.frame = CGRectMake(60, 60, 10, 10);
        cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@%ld,indexPath.row + 43]];
        cell.textLabel.font = [UIFont systemFontOfSize:15];
    }
    cell.textLabel.text = (!self.searchController.active) ? self.items[indexPath.row] : self.searchResults[indexPath.row];

    return cell;
}

业务代理返回高:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
    if (indexPath.row == 0) {
        return 100  ;
    }else{
        return 80;
    }
}

最终效果:







你可能感兴趣的:(iOS开发——UISearchController实现搜索栏功能|阳和移动开发)