iOS第三方库的基本使用

自动处理键盘事件的第三方库 IQKeyboardManager

MJRefresh下拉刷新框架使用

MJRefresh–用法最简单的下拉刷新框架

MJRefresh 下拉刷新,上拉加载的控件

提示:在block中使用self中的属性、成员变量方法需要使用弱引用
__weak __weak typeof(self) weakSelf = self;

//导入
#import <MJRefresh.h>
/** 创建header Blockf方法 */
+ (instancetype)headerWithRefreshingBlock:(MJRefreshComponentRefreshingBlock)refreshingBlock;
/** 创建header  调用方法SEL*/
+ (instancetype)headerWithRefreshingTarget:(id)target refreshingAction:(SEL)action;
//这个方法刷新时没有footer的文字,直接刷新
tableView.mj_footer = [MJRefreshAutoFooter footerWithRefreshingBlock

注意:
1.每次上拉加载更多数据后,要结束刷新状态,才能才次进行刷新
[weakSelf.centerTableView.mj_footer endRefreshing];

2.在刷新的过程中需要防止用户重复刷新,否则会导致数据加载丢失
 // 在数据获取失败的地方减少页数
        if (weakSelf.currentPage > 1) {
            weakSelf.currentPage--;
         }



//上拉刷新数据
[self.appListTableView.mj_footer beginRefreshing];
//下拉加载数据
[self.appListTableView.mj_header beginRefreshing]

例:
block方法刷新数据,对数据传值
  //上拉加载
    self.appListTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
        //因为是上拉刷新,所有显示数据的页数都是第一页,最新的数据
        weakSelf.currentPage = 1;

        //隐藏footer,在加载的过程中防止用户下拉刷新,导致数据错误
        weakSelf.appListTableView.mj_footer.hidden = YES;
        //请求数据,自己设置的方法,导入第几页的第几个数据,分类ID
        [weakSelf requestAllListWithPage:weakSelf.currentPage searchText:weakSelf.searchKeyWord categoryId:weakSelf.categoryId];
    }];
    
    //下拉刷新
    self.appListTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{
         //在刷新的过程中需要防止用户重复刷新,导致数据加载丢失
        
        weakSelf.currentPage++;
        // 隐藏header,在刷新的过程中防止用户上拉加载,导致数据错误
        weakSelf.appListTableView.mj_header.hidden = YES;
        //请求数据,自己设置的方法,导入第几页的第几个数据,分类ID
        [weakSelf requestAllListWithPage:weakSelf.currentPage searchText:weakSelf.searchKeyWord categoryId:weakSelf.categoryId];
    }];

  
  数据加载成功后需要:
  //结束下拉加载数据
  [weakSelf.appListTableView.mj_header endRefreshing];
  //结束上拉刷新数据
  [weakSelf.appListTableView.mj_footer endRefreshing];
  //取消对上拉和下拉的隐藏,让用户可以继续刷新数据        
   weakSelf.appListTableView.mj_header.hidden = NO;
   weakSelf.appListTableView.mj_footer.hidden = NO;

//对请求的数据进行判断,提示用户数据全部请求完毕
  if (weakSelf.appListArray.count(请求数据的个数)>= totalCount(总数据的个数)  ){      
    // 提示用户数据全部请求完毕
    [weakSelf.appListTableView.mj_footer endRefreshingWithNoMoreData];
    }else {
   // 当 当前请求的数据小于totalCount时(总数据的个数),重置footer的状态
   //重置没有更多的数据(消除没有更多数据的状态)
   [weakSelf.appListTableView.mj_footer resetNoMoreData];
  }

 对header的刷新进行文字设置
//先对创建MJRefreshNormalHeader 对象,在获取MJRefreshNormalHeader 的属性,进行文字设置
  MJRefreshNormalHeader * header = [MJRefreshNormalHeader headerWithRefreshingBlock

    [header setTitle:@"爷爷等得好辛苦,快来扶我" forState:MJRefreshStateIdle];
    [header setTitle:@"爷爷摔倒了" forState:MJRefreshStatePulling];
    [header setTitle:@"开开心心扶老爷爷" forState:MJRefreshStateRefreshing];

//最后千万别忘记, 设置要刷新的对象
  subjectTableView.mj_header = header
//开始加载数据
[_subjectTableView.mj_header beginRefreshing]

AFNetworking 请求网络数据


// 结束之前的所有请求
[self.manager.tasks makeObjectsPerformSelector:@selector(cancel)];
//取消AFNetworking的所有任务,使不可用
[self.manager invalidateSessionCancelingTasks:YES];

1.先要创建对象
// 网络请求
@property (nonatomic, strong) AFHTTPSessionManager * httpManager; 

//响应JSON数据
- (AFHTTPSessionManager *)httpManager
{
    if (!_httpManager) {
        _httpManager = [AFHTTPSessionManager manager];
        // 设置JSON数据序列化,将JSON数据转换为字典或者数组
        _httpManager.responseSerializer = [AFJSONResponseSerializer serializer];
        // 在序列化器中追加一个类型,text/html这个类型是不支持的,text/json, application/json
        _httpManager.responseSerializer.acceptableContentTypes = [_httpManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
    }
    return _httpManager;
}

//请求 JSON数据 requestSerializer
 if (!_afHttpMagaer) {
        
        _afHttpMagaer = [AFHTTPSessionManager manager];

          //请求JSON数据(requestSerializer)
        _afHttpMagaer.requestSerializer = [AFJSONRequestSerializer
                                            serializer];
        // 在序列化器中追加一个类型,text/html这个类型是不支持的,text/json, application/json
        _afHttpMagaer.responseSerializer.acceptableContentTypes = [_afHttpMagaer.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
        
    }
//请求GET数据
 [self.httpManager GET:(NSString *请求数据) parameters:(id一般写nil) success:^(NSURLSessionDataTask *task任务, id responseObject返回的数据) {
        请求成功会到这里
        
        在block中使用self中的属性、成员变量方法需要使用弱引用
        __weak __weak typeof(self) weakSelf = self;
         dispatch_async(dispatch_get_main_queue(), ^{
         
          // 不要忘记刷新数据 UITableView
            [weakSelf.appListTableView reloadData];
         
         [weakSelf.appListTableView reloadData];
            //数据请求成功后,要返回主线程对UI界面进行赋值
        });


    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        请求失败回到这里
    }];

//POST请求
//如果请求是字典中包含字典
{
    "record": {
        "page": 1
    }
}
//需要这样写:
  NSDictionary *dict1=@{@"page":@1};
  NSDictionary *dic2=@{@"record":dict1};
//或者这样写
  NSDictionary *dd = @{@"record":@{@"page":@1}};


  NSString *url = @"http://life.fotile.com/fotileApp/course/getRecipeList";
    [self.afHttpMagaer POST:url parameters:dic2 progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        
        ZBLog(@"美食=%@", responseObject);
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        ZBLog(@"%@", error.localizedDescription);
        
    }];


YYModel 将数据转化模型

1.第一步在模型类导入YYModel
@interface ZB_Model : NSObject <YYModel>

2.将数据转化为数组/模型
   yy_modelArrayWithClass 要转化的数组类型
   json 需要转换成模型的json数据
  NSArray *appModelArray = [NSArray yy_modelArrayWithClass:[ZB_Model class] json:appArray];
  
  NSDictionary *appModelArray = [NSDictionary yy_modelDictionaryWithClass:<#(__unsafe_unretained Class)#> json:<#(id)#>]
  


// 关联JSON数据中的key和类中的属性
// 字典中的key为属性,value为JSON数据中的key
// 当属性和JSON数据中的key不一致时会用到该方法,做映射
+ (NSDictionary *)modelCustomPropertyMapper
{
    return @{@"desc":@"description"};
}


// 当属性中为数组时,需要关联其他类,使得数组中存放该类的对象
// 字典中的key为当前类的属性,value为要关联的类的class
+ (NSDictionary *)modelContainerPropertyGenericClass
{
    return @{@"applications" : [SubjectAppModel class]};
}


Masonry 建立约束

http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/

//先关闭以前的约束
self.automaticallyAdjustsScrollViewInsets = NO;

//appListTableViewd的X,Y,宽,高等于当前的View
[self.appListTableView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.edges.equalTo(weakSelf.view);
    }];



  [self.coverImage mas_makeConstraints:^(MASConstraintMaker *make) {
       
        make.top.mas_equalTo(weakSelf.backgroundV.mas_top).offset(5);
        make.left.mas_equalTo(weakSelf.backgroundV.mas_left).offset(5);
        make.right.mas_equalTo(weakSelf.backgroundV.mas_right).offset(-5);

        //高为宽的倍数
       make.height.mas_equalTo(weakSelf.coverImage.mas_width).multipliedBy(301/345.0f);
        
    }];


   更新约束
    // 告诉self.view约束需要更新
    [self.view setNeedsUpdateConstraints];
    // 调用此方法告诉self.view检测是否需要更新约束,若需要则更新
    [self.view updateConstraintsIfNeeded];    
    [self.view layoutIfNeeded];

SDWebImage使用方法

http://www.jianshu.com/p/4191017c8b39/comments/1566836

SDWebImage 网络获取图片

需要导入UIImageView+WebCache.h头文件
[ImageView sd_setImageWithURL:[NSURL URLWithString:图片网络获取地址] placeholderImage:[占位图]];

获取下载的图片
- (id <SDWebImageOperation>)downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options
                                        progress:(SDWebImageDownloaderProgressBlock)progressBlock
                                       completed:(SDWebImageDownloaderCompletedBlock)completedBlock;

SDWebImage 清除图片缓存

导入头文件#import <SDImageCache.h>
// 获取缓存信息
// 获取缓存的图片数量
    NSInteger imageCount = [[SDImageCache sharedImageCache] getDiskCount];
  // 获取缓存的图片大小
    NSUInteger imageSize = [[SDImageCache sharedImageCache] getSize]; // 单位:字节
    NSString * msg = [NSString stringWithFormat:@"缓存文件个数:%ld,大小:%.2fM,是否清除?", imageCount, (imageSize/1024.0)/1024.0];
        
// 清除缓存
    UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"清除缓存" message:msg preferredStyle:UIAlertControllerStyleAlert];
 // 添加AlertAction
 // 取消按钮
    UIAlertAction * cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * action) {
    [alertController dismissViewControllerAnimated:YES completion:nil];
       }];
// 清除按钮
    UIAlertAction * okAction = [UIAlertAction actionWithTitle:@"清除" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *  action) {
// 清除缓存
     [[SDImageCache sharedImageCache] clearDisk];
     [[SDImageCache sharedImageCache] clearMemory];
 // 清除已过期的图片
     [[SDImageCache sharedImageCache] cleanDisk];
        }];
        
// 将Action添加到AlertController中
     [alertController addAction:cancelAction];
     [alertController addAction:okAction];
     [self presentViewController:alertController animated:YES completion:nil];

内容警告清除缓存

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

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,089评论 4 62
  • 《冬吴相对论》的吴伯凡说:幸福是一种能力。 那么快乐也是一种能力。 有能力让自己快乐的女人令人心生羡慕,有能力让别...
    努力攒钱的二花阅读 1,594评论 3 9
  • public class MergeSort { }
    Green_Apple阅读 263评论 0 0
  • 又是给粉色控美女做的两个包,一大一小~上细节图 虽然只是简单的包包,但是每个细节都不能马虎,所需要的图案都是从大块...
    拼布童话阅读 789评论 2 2
  • 因为上个手机掉厕所了,所以不得不买了现在这个新手机。补办卡的话一弄就是4G网的,很耗流量,没用几天就几百兆流量出去...
    爱别离琛妮妮阅读 199评论 0 0