大纲
一、代理
项目:CustomAlertView0317
1.基本概念
案例:点击alertView(委托者)上的按钮,改变VC1(代理)的背景颜色。alertView通过设置代理VC1,帮VC1调用协议方法changeColor。
委托者:alertView
代理:VC1
协议(协议方法):changeColor
为何协议方法要在代理中实现:其他类可以调用委托者alertView的协议(协议方法),而alertView无法为每个类实现其方法的功能,所以协议方法的实现在各个类本身。
代理的优点:安全(从后往前传值时)
2.代理
(1)非正式版本(学习前奏)
步骤:
①声明代理vc
②在代理中声明、实现协议中的方法
③在委托中调用
(2)正式版本
步骤:
①声明代理、协议方法
②实现协议方法、设置代理
③调用代理
二、滑动视图UIScrollView
项目:UIScrollView0317
步骤:
1.创建Scroll
2.设置Scroll的内容大小,并添加图片
3.设置vc的self,为Scroll的delegate
4.在vc实现Scroll中声明的协议方法
注:委托者(Scroll),代理(vc)。
三、UIPageControl
项目:PageControl0317
步骤:
1.创建并初始化
2.设置属性
3.绑定点击事件
正文
一、代理
项目:CustomAlertView0317
1.基本概念
案例:点击alertView上的按钮,来改变VC1的背景颜色,委托(alertView)通过设置代理(VC1,VC1的背景只能由VC1自己设置),调用协议方法(改变背景颜色的方法),完成相应操作。
简述:点击按钮时,alertView(委托)只负责帮VC1(代理)去调用协议方法。
委托者:alertView
代理:VC1
协议:协议方法(改变VC1的背景,委托者与代理之间的约定)
为何协议方法要在代理中实现:很多类都可以使用委托者alertView的协议(协议方法),而alertView不可能去帮助每个类完成各自指定的操作,所以它将这个任务交给了各个类本身。
代理的优点:安全(从后往前传值时)
2.代理
(1)非正式版本(学习前奏)
步骤:
①声明代理vc
②在代理中声明、实现协议中的方法
③在委托中调用
①声明代理vc
文件:MyAlertView.h
//容器,水桶
@property (nonatomic,retain)ViewController *vc;
②在代理中声明、实现协议中的方法
文件:ViewController.h
//声明
- (void)changeColor;
文件:ViewController.m
//实现
- (void)changeColor{self.view.backgroundColor = [UIColor redColor];}
③在委托中调用
文件:MyAlertView.m
//2.委托者(alertView)帮代理(viewController)调用协议方法
//实际上是代理(viewController)自己调用
[self.vc changeColor];
(2)正式版本
步骤:
①声明代理、协议方法
②实现协议方法、设置代理
③调用代理
①声明代理、协议方法
在委托者中,声明代理、协议方法
文件:MyAlertView.h
@interface MyAlertView : UIView
@property (nonatomic,assign)id delegate;
@end
@protocol MyAlertViewDelegate <NSObject>
- (void)changeColor;
@end
注意:在@interface @end之外声明协议方法
②实现协议方法、设置代理
文件:ViewController.m
(1)在代理类中实现协议方法、设置代理
- (void)changeColor{self.view.backgroundColor = [UIColor redColor];}
(2)将代理对象(vc)赋给委托者的代理属性
myAlertView.delegate = self;
③调用代理
执行协议方法
文件:MyAlertView.m
[self.delegate changeColor];
注意:
文件:MyAlertView.m
//如果使用optional描述协议,一般都要有以下判断
//如果使用required描述协议,不加判断
if ([self.delegate respondsToSelector:@selector(changeColor)])
{
//3.调用代理(正式代理)
[self.delegate changeColor];
}
二、滑动视图UIScrollView
项目:UIScrollView0317
步骤:
1.创建Scroll
2.设置Scroll的内容大小,并添加图片
3.设置vc的self,为Scroll的delegate
4.在vc实现Scroll中声明的协议方法
注:委托者(Scroll),代理(vc)。
源码:
@interface ViewController ()<UIScrollViewDelegate>
{
//速度/当前页
int _speed,_currentPage;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建
UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_BOUNDS.size.width,400)];
//2.1设置内容大小(contentSize)
scrollView.contentSize = CGSizeMake(SCREEN_BOUNDS.size.width * 5, 400);
//2.2添加图片内容
for (int i = 0; i < 5; i++)
{
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(i * SCREEN_BOUNDS.size.width, 0, SCREEN_BOUNDS.size.width, 400)];
imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i]];
[scrollView addSubview:imageView];
}
//3.设置代理
scrollView.delegate = self;
//初始速度
_speed = 1;
_timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(changeImage:) userInfo:scrollView repeats:YES];
[self.view addSubview:scrollView];
}
//开启定时器
- (void)changeImage:(NSTimer *)timer
{
UIScrollView *scrollView = timer.userInfo;
//每次page加1
//1.确定速度(+1/-1)
//2.确定当前页是否为最后一页
if (_currentPage == 0)
{
_speed = 1;
}
if (_currentPage == 4)
{
_speed = -1;
}
_currentPage += _speed;
//3.改变scrollView的偏移量
[scrollView setContentOffset:CGPointMake(SCREEN_BOUNDS.size.width * _currentPage, 0) animated:YES];
}
#pragma mark 4.实现scrollView的协议方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if (_timer)
{
//将要开始拖拽的时候,关闭定时器
[_timer invalidate];
_timer = nil;
}
}
//屏幕已经停止减速
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//根据偏移量,计算当前页
_currentPage = scrollView.contentOffset.x / SCREEN_BOUNDS.size.width;
if (_timer == nil)
{
//开启定时器
_timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(changeImage:) userInfo:scrollView repeats:YES];
}
}
@end
三、UIPageControl
项目:PageControl0317
步骤:
1.创建并初始化
2.设置属性
3.绑定点击事件
文件:ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
//1.创建并初始化
UIPageControl *pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(100, 200, 100, 30)];
//2.设置属性
pageControl.numberOfPages = 5;
pageControl.backgroundColor = [UIColor redColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.pageIndicatorTintColor = [UIColor yellowColor];
//3.绑定点击事件
//UIControlEventValueChanged:值发生改变时触发该事件
[pageControl addTarget:self action:@selector(changeImage:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:pageControl];
}
//3.1 实现所绑定的点击事件
- (void)changeImage:(UIPageControl *)pageControl
{
NSLog(@"currentPage = %d",pageControl.currentPage);
}
四、实际操作
1.个人信息→设置姓名
反向传值(使用代理模式):
步骤:
- 声明代理、协议方法
- 实现协议方法、设置代理
- 委托中调用代理
2.UIScrollView与PageControl的结合