ios开发-UI基础-应用管理(单纯界面)改进5-使用代理实现监听下载按钮的点击(delegate)

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/

前几篇文章介绍了一个应用管理的小应用,从最开始的单纯实现功能,一步一步就行改进\封装,上篇文章是使用xib进行了优化,本篇文章使用代理实现监听下载按钮的点击.

在原来的基础上,使用代理的主要思路分析:

首先要新建一个协议声明协议的要实现的方法(一般为optional)声明一个遵守该协议的代理的属性使用代理,通知其代理完成操作在代理中的实现步骤:

遵守协议设置代理(一般通过拖线也可以实现)实现代理中需要实现的方法

附上应用代码结构及xib截图:

附上源代码:

AppView.h

1//2//AppView.h3//UI基础-03-05-144//5//Created by hukezhu on 15/5/15.6//7//89#import<UIKit/UIKit.h>10@classKZAppModel;11@classAppView;12131415@PRotocolAppViewProtocol <NSObject>1617- (void)appViewDownload:(AppView *)appView;1819@end202122232425@interfaceAppView : UIView2627//声明一个模型属性,用来接收传过来的模型数据28@property (nonatomic,strong)KZAppModel *appViewModel;293031//声明一个代理的属性32@property(nonatomic,assign)id<AppViewProtocol>delegate;3334//用来加载xib35+(instancetype)loadNib;36@end

AppView.m

1//2//AppView.m3//UI基础-03-05-144//5//Created by hukezhu on 15/5/15.6//7//[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/89#import"AppView.h"10#import"KZAppModel.h"11@interfaceAppView ()12@property (nonatomic,weak)IBOutlet UIImageView *imageView;13@property (weak, nonatomic) IBOutlet UILabel *label;1415-(IBAction)btnOnClick:(UIButton *)btn;16@end171819@implementationAppView20//重写模型的set方法21-(void)setAppViewModel:(KZAppModel *)appViewModel{2223_appViewModel =appViewModel;24self.imageView.image =[UIImage imageNamed:appViewModel.icon];25self.label.text =appViewModel.name;26}272829+(instancetype)loadNib{3031return[[NSBundle mainBundle]loadNibNamed:@"AppView"owner:nil options:nil][0];32}333435/*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/36/**37* 按钮的点击方法38*39* @param btn 将按钮本身传入方法中,哪个按钮被点击就调用这个方法40*/41- (void)btnOnClick:(UIButton *)btn{4243//NSLog(@"------%@",btn);44btn.enabled =NO;45[btn setTitle:@"已下载"forState:UIControlStateNormal];4647if([self.delegaterespondsToSelector:@selector(appViewDownload:)]) {48[self.delegateappViewDownload:self];49}505152}5354@end

KZAppModel.h

1//2//KZAppModel.h3//UI基础-03-05-144//5//Created by hukezhu on 15/5/15.6//7//89#import<Foundation/Foundation.h>10/*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/11@interfaceKZAppModel : NSObject12/**13* 应用图标14*/15@property (nonatomic ,copy) NSString *icon;16/**17* 应用名称18*/19@property (nonatomic ,copy) NSString *name;2021/**22* 通过字典来初始化对象23*24* @param dict 字典对象25*26* @return 已经初始化完毕的模型对象27*/28- (instancetype)initWithDict:(NSDictionary *)dict;2930//类方法31+ (instancetype)appWithModelDict:(NSDictionary *)dict;3233@end

KZAppModel.m

1//2//KZAppModel.m3//UI基础-03-05-144//5//Created by hukezhu on 15/5/15.6//7//89#import"KZAppModel.h"1011@implementationKZAppModel12/*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/13//对象方法14-(instancetype)initWithDict:(NSDictionary *)dict{1516//重写构造方法的默认写法17if(self =[super init]){1819//将字典的所有属性赋值给模型20self.icon = dict[@"icon"];21self.name = dict[@"name"];22}23returnself;24}25//类方法26+(instancetype)appWithModelDict:(NSDictionary *)dict{2728//注意此处是self29return[[self alloc]initWithDict:dict];30}31@end

ViewController.m

1//2//ViewController.m3//03-应用管理4//5//Created by hukezhu on 15/5/14.6//7//89#import"ViewController.h"10#import"KZAppModel.h"11#import"AppView.h"121314@interfaceViewController () <AppViewProtocol>15@property (nonatomic,strong)NSArray *apps;16@end1718@implementationViewController1920- (void)viewDidLoad {21[super viewDidLoad];2223//每一行的应用的个数24inttotalCol =3;25/*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/2627//添加一个小的view28CGFloat appW =80;29CGFloat appH =100;30CGFloat marginX =20;31CGFloat marginY =20;32CGFloat hightMargin =30;33CGFloat leftMargin = (self.view.frame.size.width - totalCol * appW - (totalCol -1) *marginX)*0.5;34353637for(inti =0; i < self.apps.count; i++) {383940//计算行号和列号41introw = i /totalCol;42intcol = i %totalCol;4344CGFloat appX = leftMargin + (marginX + appW)*col;45CGFloat appY = hightMargin + (marginY + appH)*row;4647//1.添加view484950//首先拿到一个格子视图51//UIView *appView = [[NSBundle mainBundle]loadNibNamed:@"AppView" owner:nil options:nil][0];5253AppView *appView =[AppView loadNib];545556//1.2设置frame57appView.frame =CGRectMake(appX, appY, appW, appH);58//1.3设置背景色(便于代码阶段验证,之后会删除)59//appView.backgroundColor = [UIColor redColor];60//1.4将这个appView添加到view中61[self.view addSubview:appView];6263//加载数据64//NSDictionary *dict = self.apps[i];65//将数据赋值给模型对象66KZAppModel *appModel =self.apps[i];676869//通过数组的特性拿到里面的小控件,进行赋值70//UIImageView *imageView = (UIImageView *)appView.subviews[0];71//imageView.image = [UIImage imageNamed:appModel.icon];72//73//UILabel *label = appView.subviews[1];74//label.text = appModel.name;757677appView.appViewModel =appModel;78798081#warning设置视图的代理为控制器:8283appView.delegate=self;848586//UIButton *downBtn = (UIButton *)appView.subviews[2];87//[downBtn addTarget:self action:@selector(btnOnClick:) forControlEvents:UIControlEventTouchUpInside];888990////2.添加图片UIImageView91//CGFloat imageW = 60;92//CGFloat imageH = 50;93//CGFloat imageX = (appW - imageW)*0.5;94//CGFloat imageY = 0;95//UIImageView *imageView = [[UIImageView alloc]init];96//imageView.frame = CGRectMake(imageX, imageY, imageW, imageH);97////imageView.backgroundColor = [UIColor blueColor];98////imageView.image = [UIImage imageNamed:dict[@"icon"]];99////从模型对象中取出数据100//imageView.image = [UIImage imageNamed:appModel.icon];101//[appView addSubview:imageView];102//103//104////3.添加应用名称105//106//CGFloat labelW = 80;107//CGFloat labelH = 25;108//CGFloat labelX = 0;109//CGFloat labelY = imageH;110//UILabel *label = [[UILabel alloc]init];111//label.frame = CGRectMake(labelX, labelY, labelW, labelH);112////label.backgroundColor = [UIColor grayColor];113////label.text = dict[@"name"];114////从模型对象中取出数据name115//label.text = appModel.name;116//117////设置字体大小118//label.font = [UIFont systemFontOfSize:13];119////设置字体居中120//label.textAlignment = NSTextAlignmentCenter;121//[appView addSubview:label];122//123////4.添加下载按钮124//125//CGFloat downloadW = 60;126//CGFloat downloadH = 25;127//CGFloat downloadX = 10;128//CGFloat downloadY = labelH + labelY;129//UIButton *downloadBtn = [[UIButton alloc]init];130//downloadBtn.frame = CGRectMake(downloadX, downloadY, downloadW, downloadH);131////downloadBtn.backgroundColor = [UIColor yellowColor];132////设置背景图片133//[downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen"] forState:UIControlStateNormal];134//[downloadBtn setBackgroundImage:[UIImage imageNamed:@"buttongreen_highlighted"] forState:UIControlStateHighlighted];135////设置字体第一种方法136//[downloadBtn setTitle:@"下载" forState:UIControlStateNormal];137//138////设置字体第二种方法(不推荐使用)139//downloadBtn.titleLabel.text = @"下载";140//141////设置字体大小142//downloadBtn.titleLabel.font = [UIFont systemFontOfSize:15];143//[appView addSubview:downloadBtn];144//145//146//[downloadBtn addTarget:self action:@selector(btnOnClick:) forControlEvents:UIControlEventTouchUpInside];147}148149150151152153}154155156157-(void)appViewDownload:(AppView *)appView{158159160161CGFloat labelW =120;162CGFloat labelH =30;163CGFloat labelX = (self.view.frame.size.width - labelW)*0.5;164CGFloat labelY = (self.view.frame.size.height - labelH)*0.5;165UILabel *label =[[UILabel alloc]init];166label.frame =CGRectMake(labelX, labelY, labelW, labelH);167label.text =@"正在下载";168//设置字体颜色169label.textColor =[UIColor redColor];170//设置字体居中171label.textAlignment =NSTextAlignmentCenter;172//设置 背景色173label.backgroundColor =[UIColor blackColor];174175//设置圆角的半径176label.layer.cornerRadius =8;177//将多余的部分减掉178label.layer.masksToBounds =YES;179//设置透明度180label.alpha =0.0;181//将label添加到view中182[self.view addSubview:label];183//使用block动画,动画持续时间2秒184[UIView animateWithDuration:2.0animations:^{185label.alpha =0.5;186} completion:^(BOOL finished) {187if(finished) {188[UIView animateWithDuration:2.0delay:0.1options:UIViewAnimationOptionCurveLinear animations:^{189label.alpha =0.0;190} completion:^(BOOL finished) {191//上面将透明度设置为0,界面上已经不显示这个label,但是它仍然在内存中,所以为了节约内存,仍要将其从内存中删除192[label removeFromSuperview];193194}];195}196}];197}198/**199* "懒加载",加载应用数据200*201*/202- (NSArray *)apps{203204//如果_apps为空,才加载数据205if(_apps ==nil) {206//获取plist的全路径207NSString *path = [[NSBundle mainBundle]pathForResource:@"app.plist"ofType:nil];208209//加载数组210NSArray *dictArray =[NSArray arrayWithContentsOfFile:path];211212//创建一个可变数组,来动态接收模型对象213NSMutableArray *array =[NSMutableArray array];214215//通过循环,将字典数组的字典取出,转成模型对象216for(NSDictionary *dictindictArray) {217KZAppModel *appModel =[KZAppModel appWithModelDict:dict];218[array addObject:appModel];219}220_apps =array;221}222return_apps;223/*吃唐僧肉的小悟空-转载请注明出处http://www.cnblogs.com/hukezhu/*/224}225226- (void)didReceiveMemoryWarning {227[super didReceiveMemoryWarning];228//Dispose of any resources that can be recreated.229}230231@end

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航