博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS中 UISearchController 搜索栏 UI技术分享
阅读量:7082 次
发布时间:2019-06-28

本文共 9906 字,大约阅读时间需要 33 分钟。

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

懒加载及释放

@implementation SearchViewController- (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;    }}
最终效果:
你可能感兴趣的文章
mkdir failed for img Read-only file system
查看>>
写在2015年即将来临之际
查看>>
【UVA】434-Matty's Blocks
查看>>
MyISAM和InnoDB的区别
查看>>
boost.lexical_cast 学习
查看>>
Android中使用第三方jar包
查看>>
JS问题Uncaught ReferenceError:XXXX is not defined
查看>>
android之【本地通知Notification】
查看>>
应用程序框架实战三十:表现层及ASP.NET MVC介绍(一)
查看>>
Android之drawable state各个属性详解
查看>>
【.NET特供-第三季】ASP.NET MVC系列:MVC与三层图形对照
查看>>
平衡二叉树
查看>>
采用FPGA实现多种类型的数字信号处理滤波器
查看>>
浅谈android4.0开发之GridLayout布局
查看>>
CloseHandle(),TerminateThread(),ExitThread()的差别
查看>>
后端码农谈前端(HTML篇)第三课:常见属性
查看>>
NPOI系列
查看>>
virtual private catalog
查看>>
Android剪裁图片简单的方法
查看>>
iPhone/Mac Objective-C内存管理教程和原理剖析
查看>>