UI一揽子计划 20 (豆瓣实战之图片缓存 、豆瓣实战之详情界面(自适应行高) 、豆瓣实战之登陆注销、刘新林分享之UIAlertController)
// 成功返回data
- (void)imageDownSucceedWithData:(NSData *)data
{
// 给model里的图片 赋值
self.getUrlImage = [UIImage imageWithData:data];
// 标识加载完毕
_isDownloading = NO;
// 图片缓存
FileManager *manager = [FileManager shareManager];
[manager saveImageData:data imageURl:self.image];
1. 图片显示在cell 上,需要看显示图片的方法
2. 当model 中的getUrlImage为空的时候是去请求图片的,
3. 现在需要加载缓存.
4. 不请求 就是model 中的getUrlImage 不为空
5. 如果给 getUrlImage 赋值 缓存中的图片 就 达到目的了
6. 新问题: 如何给 getUrlImage 赋值 缓存中的图片?
7. 利用图片的 网址 可以找到对应的缓存图片
8. 如何在一开始赋值的时候 就把缓存中的图片赋值model
- (void)setValue:(id)value forKey:(NSString *)key
{
self.imagePath = [[FileManager shareManager] imagesPathWithImageUrl:self.image];
self.getUrlImage = [UIImage imageWithContentsOfFile:self.imagePath];
}
+ (FileManager *)shareManager;
- (void)saveImageData:(NSData *)imageData imageURl:(NSString *)imageUrl;
// 传url 返回一个URL 完整路径
- (NSString *)imagesPathWithImageUrl:(NSString *)imageUrl;
+ (FileManager *)shareManager
{
static FileManager *manager = nil;
if (manager == nil) {
manager = [[FileManager alloc]init];
}
return manager;
}
// 1. 把文件夹创建在沙盒的缓存文件夹里
// 2. 需要把图片的网址变成图片名字 然后拼接成地址
// 3. 把图片写进文件 按完整地址(文件夹 + 名字)
// 返回cache文件夹的路径
- (NSString *)cachesPath
{
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
NSLog(@"%@", cachePath);
return cachePath;
}
// 在cache文件夹下创建一个ImageDownload文件夹
- (NSString *)createImageDownloadFile
{
NSString *imageDownloadPath = [[self cachesPath] stringByAppendingPathComponent:@"ImageDownload"];
NSFileManager *manager = [NSFileManager defaultManager];
// 判断文件夹是否存在
if ([manager isExecutableFileAtPath:imageDownloadPath] == NO) {
// 文件夹不存在 就创建一个
[manager createDirectoryAtPath:imageDownloadPath withIntermediateDirectories:YES attributes:nil error:nil];
}
return imageDownloadPath;
}
// 图片的路径 需要图片的网址 和 文件夹的路径
- (NSString *)imagesPathWithImageUrl:(NSString *)imageUrl
{
// 转换图片的名字 把"/"转换成"_"
NSString *imageName = [imageUrl stringByReplacingOccurrencesOfString:@"/" withString:@"_"];
// 拼接完整的路径
NSString *imagePath = [[self createImageDownloadFile] stringByAppendingPathComponent:imageName];
return imagePath;
}
// 利用路径保存图片的data
- (void)saveImageData:(NSData *)imageData imageURl:(NSString *)imageUrl
{
// 保存的前提是要有文件夹
//NSString *imageDownloadPath = [self createImageDownloadFile];
// 得到图片的路径
NSString *imagePath = [self imagesPathWithImageUrl:imageUrl];
// 写文件
[imageData writeToFile:imagePath atomically:YES];
}
//没有图像,下载图像
view.activityImageView.image = [UIImage imageNamed:@"picholder"];
[self.model imageDownload];
// 添加一个观察者来观察图片是否已经加载出来了
[self.model addObserver:self forKeyPath:@"getUrlImage" options:NSKeyValueObservingOptionNew context:nil];
}else{
view.activityImageView.image = self.model.getUrlImage;
{
{
//计算活动内容的高度
CGRect frame = [content boundingRectWithSize:CGSizeMake(_titleLabel.width, 10000000) options:(NSStringDrawingUsesLineFragmentOrigin) attributes:[NSDictionary dictionaryWithObject:[UIFont systemFontOfSize:12] forKey:NSFontAttributeName] context:nil];
@interface UserManager : NSObject
+(UserManager *)shareUserManager;
// 传进来一个账号 把账号持久化
- (void)userName:(NSString *)userName;
// 返回账号信息
- (NSString *)userName;
- (void)password:(NSString *)passord;
- (NSString *)password;
- (void)isLogin:(BOOL)isLogin;
- (BOOL)isLogin;
@implementation UserManager
+(UserManager *)shareUserManager
{
static UserManager *manager = nil;
if (manager == nil) {
manager = [[UserManager alloc]init];
}
return manager;
}
// 传进来一个账号 把账号持久化
- (void)userName:(NSString *)userName
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:userName forKey:kUserName];
// 同步数据
[userDefaults synchronize];
}
// 返回账号信息
- (NSString *)userName
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
return [userDefaults objectForKey:kUserName];
}
- (void)password:(NSString *)passord
{
[[NSUserDefaults standardUserDefaults] setObject:passord forKey:kPassword];
[[NSUserDefaults standardUserDefaults] synchronize];
}
- (NSString *)password
{
return [[NSUserDefaults standardUserDefaults] objectForKey:kPassword];
}
- (void)isLogin:(BOOL)isLogin
{
[[NSUserDefaults standardUserDefaults] setBool:isLogin forKey:kLoginState];
[[NSUserDefaults standardUserDefaults]synchronize];
}
- (BOOL)isLogin
{
return [[NSUserDefaults standardUserDefaults]boolForKey:kLoginState];
}
[super viewDidLoad];
UIButton *button = [UIButton buttonWithType:(UIButtonTypeCustom)];
button.frame = CGRectMake(100, 100, 100, 100);
[button setTitle:@"点击" forState:(UIControlStateNormal)];
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(action:) forControlEvents:(UIControlEventTouchUpInside)];
- (void)action:(UIButton *)button
{
UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"提示" message:@"我是alert框" preferredStyle:(UIAlertControllerStyleAlert)];
// 创建一个按钮
// handler 处理点击事件
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {
// block 回调
UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:^(UIAlertAction *action) {
[alertVC addAction:cancelAction];
[alertVC addTextFieldWithConfigurationHandler:^(UITextField *textField) {
UI一揽子计划 20 (豆瓣实战之图片缓存 、豆瓣实战之详情界面(自适应行高) 、豆瓣实战之登陆注销、刘新林分享之UIAlertController)相关推荐
- UI一揽子计划 9 (UITableView 、UITableView 、重用机制)
一. UITableView UITableView继承自UIScrollView,所以可以滚动 表视图的每⼀一条数据都是显示在UITableViewCell对象中 表视图可以分区显⽰示数据,每个分区 ...
- EasyPOI图片插入自适应行高
easyPOI最新的文档链接地址: http://doc.wupaas.com/docs/easypoi/easypoi-1c0u4mo8p4ro8 1.模板中插入图片 ByteArrayOutput ...
- UI一揽子计划 21 (UICollectionView、SDWebImage第三方类库加载图片的使用、集合视图的布局UICollectionViewFlowLayout 、自定义Cell、布局协议
Pro : SDWebImage第三方类库加载图片的使用: 1.在MRC 环境下 使用ARC 的类库: -fobjc-arc (Build Phases --> Compile Sourc ...
- UI一揽子计划 17 (image的异步加载、KVO观察者模式、KVO进行豆瓣列表界面图片的异步加载)
把下载图片的封装起来 ImageDownloader.h #import <Foundation/Foundation.h> @protocol ImageDownloaderDel ...
- UI一揽子计划 6 (UIControl、UISegmentedControl、UIImageView插入数组图片、UISlider)
一 UIControl 是所有控制类控件的基类. · 比如UIButton UISlider UISegmentedControl 等只要跟控件有关系的都继承于UIControl类 ...
- UI一揽子计划 12 (模态ViewController、单例、通讯录实战、)
一.模态ViewController 程序中切换⻚面,可以使⽤用UINavigationController.通过导航功能实现⻚面切 换. 某种情况下,可以使⽤视图控制器的一对⽅法实现切换⻚面 1.p ...
- UI一揽子计划 8 (UINavigationController 、界面通信 、NSTimer 、NSUserDefaults)
一.UINavigationController // 创建一个导航控制器 // 创建一个控制器作为根控制器 去管理 RootViewController *rootVC ...
- UI一揽子计划 11 (自定义UITableViewCell、Cell 的自适应高度)
一. 自定义UITableViewCell 在日常的编程中,系统提供的几种Cell 样式 往往不能满足我们的需求.所以需要我们给它进行自定义样式. 自定义Cell 就是创建一个UITableViewC ...
- UI一揽子计划 22 (多线程概述、NSThread、NSOperationQueue 、GCD、多线程管理)
一.多进程概述: 进程: 一个正在运行的程序 叫做一个进程 多进程: 多个程序正在运行 叫做多线程 线程: 一个进程 都会有一个或多个线程 如果只有一个 叫做主线程 主线程负 ...
最新文章
- 小说站 章节内容 ajax,第17章 作业分析与异步编程原理——2019年5月14日22:00
- vue基础整理-组件
- C语言内存管理超详解
- python 创建json_使用Django和Python创建Json response的方法
- linux网络保存退出,linux编辑文件后如何保存退出
- 关于接地:数字地、模拟地、信号地、交流地、直流地、屏蔽地、浮
- 《Netkiller Spring Cloud 手札》Spring boot 2.0 mongoTemplate 操作范例
- mysql linux附加数据库文件夹,Linux全攻略--MySQL数据库配置与管理
- GNN手绘草图识别新架构:Multi-Graph Transformer 网络
- 单一课和综合课的划分依据_缠论108课第105课:股票的操作中远离小聪明,保持机械性的操作...
- Windows Server 2016-批量设置用户下次登陆须更改密码
- 在CentOS6.0 上安装LAMP
- 自豪地采用WordPress,如何删除链接?
- 模拟游戏--艾伦·图灵的传奇人生
- 标量与向量乘积求导法则
- 每日一学20——凉鞋的简易消息机制
- Kotlin与Java的异同
- Js勾选同意协议教程-更新篇
- Apple 好莱坞艳照门的安全分析
- ISIS-广播网络DIS更新LSDB