大綱
一、代理
項目:CustomAlertView0317
1.基本概念
案例:點擊alertView(委托者)上的按鈕啥刻,改變VC1(代理)的背景顏色。alertView通過設(shè)置代理VC1,幫VC1調(diào)用協(xié)議方法changeColor浮禾。
委托者:alertView
代理:VC1
協(xié)議(協(xié)議方法):changeColor
為何協(xié)議方法要在代理中實現(xiàn):其他類可以調(diào)用委托者alertView的協(xié)議(協(xié)議方法),而alertView無法為每個類實現(xiàn)其方法的功能澈歉,所以協(xié)議方法的實現(xiàn)在各個類本身写半。
代理的優(yōu)點:安全(從后往前傳值時)
2.代理
(1)非正式版本(學(xué)習(xí)前奏)
步驟:
①聲明代理vc
②在代理中聲明、實現(xiàn)協(xié)議中的方法
③在委托中調(diào)用
(2)正式版本
步驟:
①聲明代理、協(xié)議方法
②實現(xiàn)協(xié)議方法绊袋、設(shè)置代理
③調(diào)用代理
二毕匀、滑動視圖UIScrollView
項目:UIScrollView0317
步驟:
1.創(chuàng)建Scroll
2.設(shè)置Scroll的內(nèi)容大小,并添加圖片
3.設(shè)置vc的self癌别,為Scroll的delegate
4.在vc實現(xiàn)Scroll中聲明的協(xié)議方法
注:委托者(Scroll)皂岔,代理(vc)。
三展姐、UIPageControl
項目:PageControl0317
步驟:
1.創(chuàng)建并初始化
2.設(shè)置屬性
3.綁定點擊事件
正文
一躁垛、代理
項目:CustomAlertView0317
1.基本概念
案例:點擊alertView上的按鈕,來改變VC1的背景顏色圾笨,委托(alertView)通過設(shè)置代理(VC1教馆,VC1的背景只能由VC1自己設(shè)置),調(diào)用協(xié)議方法(改變背景顏色的方法)擂达,完成相應(yīng)操作土铺。
簡述:點擊按鈕時,alertView(委托)只負責(zé)幫VC1(代理)去調(diào)用協(xié)議方法板鬓。
委托者:alertView
代理:VC1
協(xié)議:協(xié)議方法(改變VC1的背景舒憾,委托者與代理之間的約定)
為何協(xié)議方法要在代理中實現(xiàn):很多類都可以使用委托者alertView的協(xié)議(協(xié)議方法),而alertView不可能去幫助每個類完成各自指定的操作穗熬,所以它將這個任務(wù)交給了各個類本身镀迂。
代理的優(yōu)點:安全(從后往前傳值時)
2.代理
(1)非正式版本(學(xué)習(xí)前奏)
步驟:
①聲明代理vc
②在代理中聲明、實現(xiàn)協(xié)議中的方法
③在委托中調(diào)用
①聲明代理vc
文件:MyAlertView.h
//容器唤蔗,水桶
@property (nonatomic,retain)ViewController *vc;
②在代理中聲明探遵、實現(xiàn)協(xié)議中的方法
文件:ViewController.h
//聲明
- (void)changeColor;
文件:ViewController.m
//實現(xiàn)
- (void)changeColor{self.view.backgroundColor = [UIColor redColor];}
③在委托中調(diào)用
文件:MyAlertView.m
//2.委托者(alertView)幫代理(viewController)調(diào)用協(xié)議方法
//實際上是代理(viewController)自己調(diào)用
[self.vc changeColor];
(2)正式版本
步驟:
①聲明代理、協(xié)議方法
②實現(xiàn)協(xié)議方法妓柜、設(shè)置代理
③調(diào)用代理
①聲明代理箱季、協(xié)議方法
在委托者中,聲明代理棍掐、協(xié)議方法
文件:MyAlertView.h
@interface MyAlertView : UIView
@property (nonatomic,assign)id delegate;
@end
@protocol MyAlertViewDelegate <NSObject>
- (void)changeColor;
@end
注意:在@interface @end之外聲明協(xié)議方法
②實現(xiàn)協(xié)議方法藏雏、設(shè)置代理
文件:ViewController.m
(1)在代理類中實現(xiàn)協(xié)議方法、設(shè)置代理
- (void)changeColor{self.view.backgroundColor = [UIColor redColor];}
(2)將代理對象(vc)賦給委托者的代理屬性
myAlertView.delegate = self;
③調(diào)用代理
執(zhí)行協(xié)議方法
文件:MyAlertView.m
[self.delegate changeColor];
注意:
文件:MyAlertView.m
//如果使用optional描述協(xié)議作煌,一般都要有以下判斷
//如果使用required描述協(xié)議掘殴,不加判斷
if ([self.delegate respondsToSelector:@selector(changeColor)])
{
//3.調(diào)用代理(正式代理)
[self.delegate changeColor];
}
二、滑動視圖UIScrollView
項目:UIScrollView0317
步驟:
1.創(chuàng)建Scroll
2.設(shè)置Scroll的內(nèi)容大小粟誓,并添加圖片
3.設(shè)置vc的self奏寨,為Scroll的delegate
4.在vc實現(xiàn)Scroll中聲明的協(xié)議方法
注:委托者(Scroll),代理(vc)鹰服。
源碼:
@interface ViewController ()<UIScrollViewDelegate>
{
//速度/當(dāng)前頁
int _speed,_currentPage;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.創(chuàng)建
UIScrollView *scrollView = [[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_BOUNDS.size.width,400)];
//2.1設(shè)置內(nèi)容大胁⊥(contentSize)
scrollView.contentSize = CGSizeMake(SCREEN_BOUNDS.size.width * 5, 400);
//2.2添加圖片內(nèi)容
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.設(shè)置代理
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.確定當(dāng)前頁是否為最后一頁
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.實現(xiàn)scrollView的協(xié)議方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
if (_timer)
{
//將要開始拖拽的時候揽咕,關(guān)閉定時器
[_timer invalidate];
_timer = nil;
}
}
//屏幕已經(jīng)停止減速
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
//根據(jù)偏移量,計算當(dāng)前頁
_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.創(chuàng)建并初始化
2.設(shè)置屬性
3.綁定點擊事件
文件:ViewController.m
- (void)viewDidLoad {
[super viewDidLoad];
//1.創(chuàng)建并初始化
UIPageControl *pageControl = [[UIPageControl alloc]initWithFrame:CGRectMake(100, 200, 100, 30)];
//2.設(shè)置屬性
pageControl.numberOfPages = 5;
pageControl.backgroundColor = [UIColor redColor];
pageControl.currentPageIndicatorTintColor = [UIColor blackColor];
pageControl.pageIndicatorTintColor = [UIColor yellowColor];
//3.綁定點擊事件
//UIControlEventValueChanged:值發(fā)生改變時觸發(fā)該事件
[pageControl addTarget:self action:@selector(changeImage:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:pageControl];
}
//3.1 實現(xiàn)所綁定的點擊事件
- (void)changeImage:(UIPageControl *)pageControl
{
NSLog(@"currentPage = %d",pageControl.currentPage);
}
四亲善、實際操作
1.個人信息→設(shè)置姓名
反向傳值(使用代理模式):
步驟:
- 聲明代理、協(xié)議方法
- 實現(xiàn)協(xié)議方法逗柴、設(shè)置代理
- 委托中調(diào)用代理
2.UIScrollView與PageControl的結(jié)合