自动处理键盘事件的第三方库 IQKeyboardManager
MJRefresh下拉刷新框架使用
MJRefresh–用法最简单的下拉刷新框架
MJRefresh 下拉刷新,上拉加载的控件
提示:在block中使用self中的属性、成员变量方法需要使用弱引用
__weak __weak typeof(self) weakSelf = self;
//导入
#import
/** 创建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
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 )downloadImageWithURL:(NSURL *)url options:(SDWebImageDownloaderOptions)options
progress:(SDWebImageDownloaderProgressBlock)progressBlock
completed:(SDWebImageDownloaderCompletedBlock)completedBlock;
SDWebImage 清除图片缓存
导入头文件#import
// 获取缓存信息
// 获取缓存的图片数量
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];
}