#import "JQListController.h"
#import "JQNavigationController.h"
#import "JQAddWordController.h"
#import "JQEditController.h"
#import "JQWordTool.h"
#import "JQWord.h"
#import "JQListCell.h"
#import "JQCardView.h"
#import "JQAnimationTool.h"
@interface JQListController () <UISearchResultsUpdating>
@property (nonatomic,strong)NSArray *wordGroups;//单词组 数组
@end
@implementation JQListController{
//搜索结果的数组
NSMutableArray * _searchArray;
//搜索视图
UISearchController * _searchVC;//(ios 8.0 and later)
//搜索结果的表格视图
UITableViewController * _searchTableVC;
}
#pragma mark 生命周期方法
- (void)viewDidLoad {
[super viewDidLoad];
self.definesPresentationContext=YES;
/*在当前的控制器要显示其他的控制器(比如modal方式或present)时,是否提供设备上下文;
在这里因为我们使用了搜索功能,所以要开启这个*/
//去分割线
self.tableView.separatorStyle=UITableViewCellSeparatorStyleNone;
//设置cell高
self.tableView.rowHeight=55;
//加号按钮
self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addWord)];
//创建子控件
[self createSubviews];
}
//即将显示view
- (void)viewWillAppear:(BOOL)animated{
//从沙盒拿出数据
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
self.wordGroups=[JQWordTool shareWordGroups];
dispatch_sync(dispatch_get_main_queue(), ^{
//刷新数据
[self.tableView reloadData];
});
});
}
#pragma mark 初始配置方法
- (void)createSubviews{
//创建搜索视图
[self createSearchController];
}
/**
* 创建搜索视图
*/
- (void)createSearchController
{
//1.配置表格视图
//->创建表格视图
_searchTableVC = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain];
//->表格视图设置代理,数据源代理
_searchTableVC.tableView.dataSource = self;
_searchTableVC.tableView.delegate = self;
//->设置表格视图frame
_searchTableVC.tableView.frame = self.view.bounds;
//2.配置搜索视图
//->根据表格视图创建搜索视图
_searchVC = [[UISearchController alloc]initWithSearchResultsController:_searchTableVC];
//->设置搜索栏frame(这里主要是设置宽高)
_searchVC.searchBar.frame = CGRectMake(0, 0, self.view.bounds.size.width, 44);
//->把搜索栏放到tableview的头视图上
self.tableView.tableHeaderView = _searchVC.searchBar;
//->设置搜索视图代理
_searchVC.searchResultsUpdater = self;
}
#pragma mark - Table view 代理方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if (tableView==self.tableView) {
return self.wordGroups.count;
}
return 1;//搜索视图的表格视图只需要一组
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (tableView==self.tableView) {
JQWordGroup *wordGroup = self.wordGroups[section];
return wordGroup.words.count;
}
return _searchArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//根据不同的表格视图来给cell赋值
JQListCell *cell=[JQListCell cellWithTableView:tableView];
if (tableView==self.tableView) {
JQWordGroup *wordGroup = self.wordGroups[indexPath.section];
cell.word=wordGroup.words[indexPath.row];
}else{
cell.word=_searchArray[indexPath.row];
}
return cell;
}
#pragma mark - Table view 其他代理方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
//0.退回键盘
[_searchVC.view endEditing:YES];
//1.创建cardView
JQCardView *cardView = [[JQCardView alloc]init];
cardView.editTitle = @"编辑";
cardView.bounds = CGRectMake(0, 0, 230, 400);
cardView.center = CGPointMake(JQMainScreenSize.width*0.5, -(cardView.height/2.0));
if (tableView!=self.tableView) {
cardView.word = _searchArray[indexPath.row];
}else{
cardView.word = [JQWordTool getWordFromIndexPath:indexPath];
}
//2.设置cardView的触发方法
__weak typeof(cardView) tempView=cardView;
cardView.editAction=^(){
//取出cardView所在控制器,然后modal出来编辑控制器
UIViewController *VC=(UIViewController *)tempView.parentViewController;
JQNavigationController *navVC=[[JQNavigationController alloc]init];
JQEditController *editVC=[[JQEditController alloc]init];
editVC.word=tempView.word;
[navVC addChildViewController:editVC];
[VC presentViewController:navVC animated:YES completion:nil];
//提交控制器后,销毁当前cardView(回到列表的状态)
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[JQAnimationTool dissmiss];
});
};
//3.执行下落动画
[JQAnimationTool triggerDropAnimationsWithUIView:cardView hasMask:YES maskTouch:YES];
}
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// Return NO if you do not want the specified item to be editable.
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {//删除某cell
if(tableView!=self.tableView){
self.wordGroups = [JQWordTool deleteWord:_searchArray[indexPath.row]];
[_searchArray removeObjectAtIndex:indexPath.row];
[_searchTableVC.tableView reloadData];
}else{
self.wordGroups=[JQWordTool deleteWordFromIndexPath:indexPath];//保存数据
}
[self.tableView reloadData];
}
}
/**
* 返回组标题
*/
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
if (tableView==self.tableView) {
JQWordGroup *wordGroup = self.wordGroups[section];
return wordGroup.groupTitle;
}else{
return @"搜索结果:";
}
}
#pragma mark 触发响应方法
/**
* 点击右上角"+"
*/
- (void)addWord{
JQAddWordController *addWordController=[[JQAddWordController alloc]init];
JQNavigationController *navVC=[[JQNavigationController alloc]init];
[navVC addChildViewController:addWordController];
[self presentViewController:navVC animated:YES completion:nil];
}
#pragma mark 搜索的协议方法
//在点击搜索时会调用一次,点击取消按钮又调用一次
- (void)updateSearchResultsForSearchController:(UISearchController *)searchController
{
//1.判断当前搜索是否在搜索状态还是取消状态
if (_searchVC.isActive) {//表示搜索状态
_searchTableVC.tableView.rowHeight = 55;//设置cell高
//2.初始化搜索数组
if (_searchArray == nil) {
_searchArray = [[NSMutableArray alloc]init];
}else{
[_searchArray removeAllObjects];//清空搜索数组内容
//3.遍历数据源,给搜索数组添加对象
for (JQWordGroup *wordGroup in self.wordGroups)
{
for (JQWord *word in wordGroup.words)
{
//如果有对应的单词或者单词翻译就添加到搜索数组中
NSString *wordName=word.word_name;
NSString *explains=[NSString stringFromArray:word.explains WithSeparateStr:@" "];
NSRange enRange = [wordName rangeOfString:searchController.searchBar.text];
NSRange cnRrange = [explains rangeOfString:searchController.searchBar.text];
if (enRange.location != NSNotFound || cnRrange.location !=NSNotFound) {
[_searchArray addObject:word];
}
}
}
}
//4.刷新搜索界面的tableview
[_searchTableVC.tableView reloadData];
}
}
@end
/*注意:
在设置了搜索视图后,那么关于tableView相关的代理方法
要在两种清空下做处理
1.形参tableView是self的tableView
2.形参tableView是搜索视图的tableView*/
JQListCell
#import "JQListCell.h"
#import "JQLabel.h"
@interface JQListCell ()
@property (nonatomic,weak) JQLabel *nameLbl;
@property (nonatomic,weak) JQLabel *explainsLbl;
@end
@implementation JQListCell
+ (instancetype)cellWithTableView:(UITableView *)tableView{
static NSString *ID = @"JQList";
//1.判断是否存在可重用cell
JQListCell * cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (!cell)
{
//2.为cell自定义类注册并指定重用标识
[tableView registerClass:[JQListCell class] forCellReuseIdentifier:ID];
cell = [[JQListCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
}
//不要选中状态
cell.selectionStyle=UITableViewCellSelectionStyleNone;
//4.返回cell
return cell;
}
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self){
#warning 因为一个cell的默认宽度就是320,所以我们需要做这样一个修改
self.width = JQMainScreenSize.width;
//1.创建子控件
JQLabel *nameLbl = [[JQLabel alloc]init];
JQLabel *explainsLbl = [[JQLabel alloc]init];
nameLbl.backgroundColor=JQBlackColor;
nameLbl.numberOfLines=0;
nameLbl.font = JQFont;
nameLbl.textColor=[UIColor whiteColor];
explainsLbl.numberOfLines=0;
explainsLbl.backgroundColor=JQRedColor;
explainsLbl.textColor=[UIColor whiteColor];
explainsLbl.font = [UIFont systemFontOfSize:14];
[self.contentView addSubview:nameLbl];
[self.contentView addSubview:explainsLbl];
self.nameLbl = nameLbl;
self.explainsLbl = explainsLbl;
//2.设置子控件frame
CGFloat nameX = 0;
CGFloat nameY = 0;
CGFloat nameW = 90;
CGFloat nameH = 54;
CGFloat explainsX = nameW;
CGFloat explainsY = 0;
CGFloat explainsW = self.width - nameW;
CGFloat explainsH = nameH;
nameLbl.frame = CGRectMake(nameX, nameY, nameW, nameH);
explainsLbl.frame = CGRectMake(explainsX, explainsY, explainsW, explainsH);
}
return self;
}
- (void)setWord:(JQWord *)word{
_word=word;
self.nameLbl.text=word.word_name;
NSString *str=[NSString stringFromArray:word.explains WithSeparateStr:@" & "];
self.explainsLbl.text=str;
}
@end