target-action是iOS中UIControl控件下使用的最常见的消息传递方式,target-action在中文中就是目标-动作,也算是一种简单的设计模式.
主要的功能就是在发生某种事情的时候,给某某对象发送一个消息。一般情况下是在我们点击按钮,或者是滑动进度条之类的情况下发送给目标一个消息。比如说,当我们肚子饿了的时候就告诉大脑要去找东西吃。
方法调用
target-action的方法调用非常简单,一般实现一个函数:
|
|
target
target就是目标,如果用之前的例子来比喻的话就是我们的大脑。
action
action就是动作,用之前的例子来比喻的话就是去找东西吃这个动作。
events
events是事件,比如说肚子饿了,或者口渴了,是出发动作的条件。
使用
这里用给UIButton
添加点击事件来做一个🌰。
|
|
这样就可以给targetBtn添加一个按下的事件,当用户按下按钮时,按钮就会告诉self
,调用targetBtnClicked:
方法。
UIControlEvents
UIControlEvents主要是事件的触发条件。
|
|
target-action 传值
tag
target-action 模式传值一般通过tag来实现。
tag是一个无符号整形,所有的UIKit
控件都有这个属性,在设定控件时可以加上tag值,在响应事件action中可以获取到sender,通过获取sender的tag来达到传值的功能。
添加tag:
|
|
在action中获取tag值:
|
|
category 添加传值方法
tag只能传递一个整形数字,这有很大的局限性,平时我们开发时可能还需要传递一些复杂的数据,这个时候tag就显得很局促了。
所以我们可以通过给父类添加category的方式,添加一个info的字典,用来传递消息。
添加category:
|
|
使用runtime实现info的getter方法和setter方法:
|
|
在使用时设置info的值:
|
|
在action中获取info中的值:
|
|
这里我们是对NSObject
进行的一个拓展,写完这个拓展之后,只要在继承了NSObject的类的控件使用时,引入头文件:
|
|
就可以随意的传递值了。
Demo
最后放个Demo。
这里只是iOS中消息传递方式的第一部分,这种传值的方式使用到了runtime,意味着所有的NSObject子类都可以使用这个info,所以平时还是不是很建议用这种方式,如果平时想要传递一些复杂的数据可以通过其他的方式来做,比如代理、block等。
本文章仅限个人学习,如果有什么地方写的不对的还希望各位大佬批评指正。