JQWord 01(列表模块)

#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
animation.gif
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容