OC教程4目标动作回调-Target Action

OC4-目标动作回调

本章主要讲解回调的概以及具有目标动作回调接口的组件如何使用。

1,回调

回调,也叫事件触发,在底层开发中也就服务或中断服务。其产生过程较为复杂,所有我们再次不会展开讲解。只是单纯讲解如果配置回调。

在使用一些较为复杂,或者和用户有交互类型的组件时。我们通常需要根据组件触发的事件来做出相应的响应。

比如我们使用一个开关控制一个灯。我们在编写代码的时候并不能准确的知道开关的状态,也就无法确定灯的状态。所有我们只能在开关状态发送改变的时候,获取开关的状态且根据开关的状态对灯的状态进行改变。

这时候就需要开关有一个能反馈自身状态的机制。这种机制便成为回调机制。

我们在编程中可以通过回调机制让代码在运行的过程中捕获开关状态的改变点,从而实现对灯的控制。

回调机制具体有三种表现形式:

  1. 目标-动作回调
  2. 委托模式回调
  3. 代码块回调

下面我们展开讲解目标-动作回调。

2,目标-动作回调

目标:接收事件反馈的对象。比如开关要反馈自身状态,此时接收反馈信息的对象便成为目标。目标对象为id类型,因在设计开关时,并不知道开关的使用者是什么类型的对象。在代码中通常用target来表示目标对象。

动作:事件反馈所要触发的方法。比如开关要反馈给我状态改变的信息,在代码中的具体表现形式为,通调用我的某个方法来进行告知。动作对象为SEL类型。

SEL类型是OC语言为存储方法名创造的变量类型。同时还创造了一个运算符,用于把一个方法名转换成一个SEL值。

SEL test = @selector(方法名);

在编程中,如果我们想使用开关,并且要根据开关状态的反馈做出不同的处理,那么我们就需要设置开关的反馈目标和反馈动作。

能够设置反馈目标和反馈动作的组件我们成为具有目标动作回调接口的组件。

3,使用具有目标动作回调接口的组件

在真实情况下,具有目标动作接口的组件都是复杂类组件。所有在本章讲解中,使用虚拟的组件来进行OC语法上的学习。

首先我们来了解两个虚拟的组件,开关和灯

灯的声明文件

@interface Light : NSObject

-(void)turnOff;//开灯
-(void)turnOn;//关灯

@end

可见等的操作很简单,只有开灯和关灯两个方法。

开关的声明文件

typedef enum : NSUInteger {
    SwitchStateOff,//default
    SwitchStateOn,
} SwitchState;

@interface Switch : NSObject

@property(nonatomic,assign,readonly)SwitchState currentState;

-(void)addChangeStateTarget:(id)target Action:(SEL)action;

@end

开关有一个只读属性,为当前开关的状态,其状态变量为枚举类型

  • SwitchStateOff 表示关闭状态
  • SwitchStateOn 表示开启状态

开关还有一个addChangeStateTarget方法,通过该方法为这个开关设置反馈对象和反馈动作,以实现让反馈对象受到开关状态的改变信息。

下面我们假设有一个房间,房间中有一个开关和一个灯。代码实现如下:

@interface Room : NSObject

@end

@interface Room ()

@property(nonatomic,strong) Light * aLight;
@property(nonatomic,strong) Switch * aSwitch;

-(void)changeState:(Switch *)s;

@end

@implementation Room

- (instancetype)init
{
    self = [super init];
    if (self)
    {
        self.aLight = [[Light alloc] init];
        self.aSwitch = [[Switch alloc] init];
        //设置反馈对象和反馈方法
        [self.aSwitch addChangeStateTarget:self Action:@selector(changeState:)];
    }
    return self;
}

-(void)changeState:(Switch *)s
{
    if (self.sw.state == SwitchStateOff)
    {
        [self.light turnOn];
    }
    else
    {
        [self.light turnOff];
    }
}

@end

上段代码中我们依次做了如下事情

  • 创建了一个Room类的延展
  • 在延展中声明了灯和开关的属性
  • 在初始化方法中为组件分配内存
  • 在初始化方法中设置组件反馈的目标和反馈动作
  • 实习反馈方法中的具体处理逻辑

这样当代码开始运行,开关状态被用户改变之后,灯的状态也会随之改变。当然,这段代码是虚拟的。在之后章节中我们会接触到可以真正运行的代码。还需要同学们努力学习。

时间: 2024-08-05 10:46:00

OC教程4目标动作回调-Target Action的相关文章

OC3大回调模式使用总结(一)目标动作回调

OC 3大回调模式使用总结(一)目标动作回调 1.目标动作主要用于 (UIButton ,UIStepper,UISwitch,UISegmentControl,UISlider) ,是用来监听按钮等类似控件状态的编程模式,该模式产生的原因是 某些事件是不确定何时会发生,但是发生的时候就需要这么去处理,所以你需要提前写好处理这个事件的代码,当这个事件发生时,系统会调用你写的预备性质的代码(相当于预防性措施) 2.事件: UIButton对应的事件是:UIControlEventTouchUpIn

OC教程5-委托delegate模式回调

OC5-委托模式回调 本章主要讲解委托模式已经通过委托模式实现的回调接口. 1,委托模式 委托模式是OC语法独有的开发模式.是基于组件拼装的一种快速开发模式.该模式下,可以保证组件的高度灵活性和通用性.属于组件的一种开放式接口. 下面通过一个现实生活中的场景简单理解下委托模式的应用. 例如我们现在有一个公司.公司想要进行IPO.可是公司老总并不熟悉资本操作,这时候就需要委托一个人或者一个机构来作这件事. 公司首先要提出能做IPO这件事的详细要求,然后在通过猎头寻找合适的人选. 用代码描述应该是这

OC教程8-内存管理

OC8-内存管理 OC语言中的内存管理机制为ARC(Automatic Reference Counting,自动引用计数).与2011年中旬推出,替换陈旧且低效的手动内存管理,关于手动内存管理的内容,本章教程不在讲授.本章主要从以下几个方面对内存管理进行展开讲讲解. 内存管理原则 对象引用类型 属性引用类型 强引用循环 AUTO类型与释放池 1,内存管理原则 核心原则:没有被对象指针使用(指向)的内存立即释放.这个原则决定一般情况下,不会用内存泄露的情况存在,但存在特殊情况,也是本章最后一个专

OC教程9-开发模式

OC9-开发模式 本章内容主要讲述OC语言中常用的开发模式,开发模式是解决某些具体问题的固定解决方案.在OC中主要由三种可以使用 单例模式 键值观察模式 消息模式 1,单例模式 在开发过程中,经常有一些共享型的数据需要储存在一个公共的地方,需要的时候,可以方便回去.单例模式便提供创建一个公共地方的方法. @interface TestObj: NSObject @property double a; @end 例如我们声明上文中的一个对象,其中有一个a的属性可以存储数据. TestObj * o

OC教程6-代码块block回调

OC6-代码块回调 本章教程主要对代码块回调模式进行讲解,已经分析其他回调的各种优缺点和适合的使用场景. 代码块机制 Block变量类型 Block代码封装及调用 Block变量对普通变量作用域的影响 Block回调接口使用 1,代码块机制 苹果公司在iOS4 SDK中首次支持代码块机制,随后代码块机制被广泛应用于各种编码场景,最常见的为回调机制,也成为Block回调. 代码块也称Block.是封装代码的一种机制,也可以称为匿名函数. 使用这种机制可以将一段代码放入一个Block变量中进行存储,

Target Action And UIControl

Target Action And UIControl target-action的设计模式 UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem]; button.frame = CGRectMake(135, 100, 80, 40); [button setTitle:@"??" forState:UIControlStateNormal]; button.backgroundColor = [UIColor

UI 04 target...action 设计模式

"高内聚,低耦合"是面向对象编程的核心思想. 使用 target-action 实现解耦. 需要目标去执行一个动作的地方. 例如, 定义一个继承于UIView 的MyButton 类, 让他能够有Button的点击方法. 代码如下: Mybutton.h: #import <UIKit/UIKit.h> @interface Mybutton : UIView //1.写一个自定义方法,把目标和对应动作传过来. - (void)addNewTarget:(id)target

动作回调函数 (CallFunc,CallFuncN,CCCallFuncND)

动作回调函数 (例子) 1 bool HelloWorld::init() 2 { 3 ////////////////////////////// 4 // 1. super init first 5 if ( !Layer::init() ) 6 { 7 return false; 8 } 9 10 Size visibleSize = Director::getInstance()->getVisibleSize(); 11 Vec2 origin = Director::getInsta

target - action设计模式的思想

不同的实例点击效果不同:点击改变自身颜色,点击改变父视图颜色,点击修改视图位置.以上效果可由target - action设计模式实现. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor yellowColor]; CustomView *greenView = [[CustomView