IOS--UI--LessonTarget/Action /Delegate

原创 2015年07月08日 21:38:45

Target/action
1.定义:Target/action模式是为了方便开发者管理同一类的不同对象的,定义一个ActionView类,继承自UIView
例子:假设使用ActionView创建不同的视图,redView、greenView、blueView三个对象,分别让三个视图响应不同的事件,redView改变自身背景颜色,greenView改变父视图背景颜色,blueView改变自身位置。
解决方案:
方法1. 我们可以在设定的时候给redView、greenView、blueView 设定 tag 值 然后再用 switch 调用

// 1.创建根视图控制器:ActionViewController 继承 UIViewController
// 2.修改 AppDelegate 里的根视图控制器
 ActionViewController *actionVC = [[ActionViewController alloc]init];
  self.window.rootViewController = actionVC;
  [actionVC release];
//  3.在根视图的控制器中创建三个视图:
  // 红色
    ActionView *redView = [[ActionView alloc]initWithFrame:CGRectMake(20, 20, 280, 100)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
   redView.tag = 100;
    [redView release];
    //绿色
    ActionView *greenView = [[ActionView alloc]initWithFrame:CGRectMake(20, 130, 280, 100)];
    greenView .backgroundColor = [UIColor greenColor];
    greenView.tag = 101;
    [self.view addSubview:greenView];
    [greenView release];
    //蓝色
    ActionView *blueView = [[ActionView alloc]initWithFrame:CGRectMake(20, 250, 280, 100)];
    blueView.backgroundColor = [UIColor blueColor];
    [self.view addSubview:blueView];
    [blueView release];
  // 4. cmd+n 创建 ActionView 继承 UIView
   .m 中
   - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    switch (self.tag) {
        case 100:
            self.backgroundColor = [UIColor randomColor];
            break;
        case 101:
            self.superview.backgroundColor = [UIColor randomColor];
            break;
        case 102:
            self .center = CGPointMake(arc4random()%101+100, arc4random()%301+100);

        default:
            break;
    }
}
注意:笨重的 ActionView 的处理  不够灵活 每次创建一个新视图及对应的响应的处理事件 都要造成 ActionView 里的源代码 给视图添加不同的处理事件

思考:如何像 button一样灵活 ??
方法2,使用target/action模式开发。具体思想,让ActionView的对象调用一个方法,能够根据不同的对象执行不同的方法。

// ① 在ActionView类的.h文件中声明一个方法(因为外面需要使用这个方法,所以需要声明)

- (void)addTarget:(id)target action:(SEL)action;

//②,在ActionView类的.m文件中实现这个方法,实现这个方法前我们要明白这个方法的两个参数的含义,
//target指的是谁来完成这个方法,
//action指的是具体什么方法,
//所以我们需要在.m文件中定义两个变量来存放这两个参数。

@interface ActionView()
{
    id _target;// 存储响应目标(对象)
    SEL _action;//存储响应事件(方法)
}
//注意:@interface ActionView() 是在.m中实现的,所以这两个变量是私有变量,外界无法访问

实现声明的方法

- (void)addTarget:(id)target action:(SEL)action
{
     _target = target;
     _action = action;
}

③,我们要实现的就是在点击某个视图的时候响应某个方法,所以我们需要在ActionView的.m文件中的方法里实现方法

- (void)touches:(NSSet *)touches withEvent:(UIEvent*)event{
 [_target performSelector:_action withObject:self];
}
//注: _target、_action中存放的是外面调用- (void)addTarget:(id)target action:(SEL)action;方法时传进来的值,
//self指的是ActionView的一个对象。
//可以解释为:_target 帮 self 做一件事_action

④,调用- (void)addTarget:(id)target action:(SEL)action;方法
我们在试图控制器中创建了一个ActionView类的redView对象,使用redView对象调用我们设置的方法

 ActionView *redView = [[ActionView alloc]initWithFrame:CGRectMake(20, 20, 280, 100)];
    redView.backgroundColor = [UIColor redColor];
    [self.view addSubview:redView];
    [redView addTarget:self action:@selector(changeMyselfColor:)];//方法
    [redView release];
注:其实和方法1的创建视图一样  多了一个方法
// [redView addTarget:self action:@selector(changeMyselfColor: )];
//这句话的意思是,让一个对象self(视图控制器对象)调用一个方法 (changeMyselfColor:)就是我们的方法 
#pragma mark ----实现方法------

-(void)changeMyselfColor:(ActionView *)view{
    view.backgroundColor = [UIColor randomColor];
}

总结,执行顺序:④ -> ① -> ② ->③ -> ⑤,这种方式只能实现一个让target对一个action,耦合性较高,如果要实现一对多需要使用代理

下面将代理
1.重新创建了一个UIView的子类DelegateView
①,要使用代理我们首先要有一个协议,所以第一步制订协议。
制订协议有两种方法,如果这个协议是为了让多个类遵循的话,就创建一个协议文件protocol,如果只是一个类让别人帮自己做事情那么就在这个类的.h中制订协议。
在DelegateView类的.h文件中制订协议,

@class DelegateView;//告诉系统 使用了这个类
@protocol DelegateViewDelegate <NSObject>
//1.制定协议(为了写一些方法)
@optional//可选实现
//delegateView 类里的 view 如果是其他类 就会换成其他类的名字
- (void)changeMyselfColor:(DelegateView *)view;
-(void) changeSuperviewColor:(DelegateView *)view;
-(void) changeMyselfLocation:(DelegateView *)view;

@end

@interface DelegateView : UIView
//2.指定代理
@property (nonatomic,assign) id<DelegateViewDelegate>delegate;
//?为什么用 dalegate 命名 这么是命名方法 当有在 controller 使用 delegate的时候 就会变成引入的那个参数 比如我们现在的 redView.delegate = self 里 self;  如果你这个地方不是 delegate 那么你在 controller 里面要用的时候 就点 你在这里设的名字 

③ 问题来了 什么时候使用代理?
╮(╯▽╰)╭ 当然是我们需要的时候了 比如点击视图的时候 所以要在DelegateView类的.m文件中实现方法

- (void)touches:(NSSet *)touches withEvent:(UIEvent*)event{//    但是要先判断 判断代理有没有执行协议中对应的方法
    BOOL isResponder = [_delegate respondsToSelector:@selector(changeMyselfColor:)];
    //    代理执行协议方法的时机 但是要先判断
    if (isResponder) {
       [_delegate changeMyselfColor:self];
 //这里的self指的是DelegateView类的一个对象    
  }   
}

④,协议指定完毕,我们需要找个人来遵循这个协议,
我们让视图控制器遵循这个协议 DelegateUIViewController

 1.创建一个DelegateUIViewController类
 在DelegateUIViewController. h 中
@interface DelegateUIViewController : UIViewController <DelegateViewDelegate>//需要引入协议所在类的头文件
@end  
在. m 中 指定代理对象
  DelegateView *redView = [[DelegateView alloc]initWithFrame:CGRectMake(20, 30, 280, 100)];
    redView.backgroundColor = [UIColor redColor];
    //指定代理对象
    redView.delegate = self;
    [self .view addSubview:redView];
    [redView release];
     #pragma mark-----代理方法------
-(void)changeMyselfColor:(DelegateView *)view{
    view.backgroundColor = [UIColor randomColor];
     view.superview .backgroundColor=[UIColor randomColor];
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

delegate,Action和Func区别和用法

在程序开发里,有一种很常见的思想,叫委托,顾名思义就是A委托B做A想做的事情,具体实现就是A定义好函数(实现A想做的),然后把该函数以一种特殊的形式告知B,B来调用,在.Net里,这种特殊形式的实现方...
  • jklrty
  • jklrty
  • 2016年02月02日 12:04
  • 908

C# 四种委托 Delegate Action Func Predicate 的学习

首先是Delegate,它可以委托所有
  • wuha555
  • wuha555
  • 2014年11月11日 15:02
  • 1403

C# 委托(Delegate Action Func Predicate)

委托是一个类,它定义了方法的类型,使得方法可以当作另一个方法的参数传递,同时可以在另一个方法中调用。 事件是一种特殊的委托。 1、委托的声明 (1)delegate  我们经常使用的一种声明方式。 d...
  • njjackzhong
  • njjackzhong
  • 2016年05月17日 23:01
  • 942

Unity C#中Delegate,Action,Func,Predicate的使用与区别

C#4.0推出后,类似Linq,Lamda表达式等许多新的程序写法层次不穷。与之相关的Delegate,Action,Func,Predicate的使用和区别也常常让大家迷惑,此处就结合实际的应用,对...
  • qq563129582
  • qq563129582
  • 2015年08月17日 19:49
  • 4564

C#高级篇(一)---string、delegate 、Action 、Func、Lambda、事件

字符串string using System; using System.Collections.Generic; using System.Linq; using System.Text; usin...
  • wangyongfei123
  • wangyongfei123
  • 2015年10月09日 09:52
  • 649

任运自在:线程(Thread)与委托(Invoke和BeginInvoke)和封装

线程(Thread)与委托(Invoke和BeginInvoke) 这几天专门玩线程与委托,到处查找资料看,渐渐明白了用法、写法和一些注意事项; 描述: 什么是进程呢?当一个程序开始运行时,它就是一个...
  • xianfajushi
  • xianfajushi
  • 2012年05月28日 16:49
  • 15360

action outlet 委托delegate

第一次接触到委托是在学习《大话设计模式》的时候碰到的,我是一名Javaer,那本书是.Net的,里面提到了委托这个概念,并且有相应的用法与支持,当时觉得挺奇怪,怎么Java中没有遇到过呢?后来才知道,...
  • zhaoweixing1989
  • zhaoweixing1989
  • 2013年07月16日 19:04
  • 736

Action<T> Delegate 使用

So we can treat Action as a method delegate with one parameter and no return value.
  • changtianshuiyue
  • changtianshuiyue
  • 2014年02月18日 18:47
  • 4582

iOS通讯模式(KVO、Notification、Delegate、Block、Target-Action的区别)

文章翻译自https://www.objc.io/issues/7-foundation/communication-patterns/每个Application或多或少都有一些松耦合的对象(模块)组...
  • hqqsk8
  • hqqsk8
  • 2016年07月14日 18:09
  • 2797

C#中delegate的机制原理

C#下的关键字delegate实际上是告诉编译器生成一个继承自MulticastDelegate的密封类。而该类的主要职责是创建函数的回调环境。 而生成的密封类定义如下: namespace D...
  • argpunk
  • argpunk
  • 2014年12月24日 10:58
  • 5326
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:IOS--UI--LessonTarget/Action /Delegate
举报原因:
原因补充:

(最多只允许输入30个字)