iOS Target-Action设计模式的运用【修订】

简介: iOS Target-Action设计模式的运用【修订】

前言

Target-Action指当某个事件发生的时候,调用特定对象的特定方法。

例子:当用户操纵控件对象(按钮/滑块)时,它会将消息发送到指定的对象。控制对象是UIControl(iOS)或NSControl(OSX)子类的实例。

其中一个对象保存着事件发生时向另一个对象发送的所需信息。

存储的信息由两个数据项组成:动作选择器(用于标识要调用的方法)和目标(用于接收消息的对象)

image.png

arget-Action模式主要包含两个部分:

  • Target(对象):接收消息的对象,通常是自定义控制器。
  • Action(方法):用于表示需要调用的方法。

设置目标和操作

- (void)addTarget:(nullable id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
//https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget?language=objc

I 控件是如何找到Target并执行对应的Action?

- (void)sendAction:(SEL)action to:(nullable id)target forEvent:(nullable UIEvent *)event;

用户操作控件(比如点击)时,首先会调用这个方法,并将事件转发给应用程序的UIApplication对象。同时,在UIApplication类中也有一个类似的实例方法:

- (BOOL)sendAction:(SEL)action to:(nullable id)target from:(nullable id)sender forEvent:(nullable UIEvent *)event;

如果Target不为nil,应用程序会让该对象调用对应的方法响应事件;如果Target为nil,应用程序会在响应链中搜索定义了该方法的对象,然后执行该方法。

II 应用案例

2.1 实现Click事件的全埋点

方案一:【以通过Method Swizzling交换UIApplication类中的-sendAction:to:from:forEvent:方法,然后在交换后的方法中触发AppClick事件,并根据target和sender采集相关属性,实现Click事件的全埋点】

https://kunnan.blog.csdn.net/article/details/108018307

方案二:【实现AppClick事件的全埋点】(Method Swizzling交换UIView的-didMoveToSuperview方法给控件添加Target-Action并采集相关属性)

https://blog.csdn.net/z929118967/article/details/108019408

方案一和方案二其实都运用了iOS中的Target-Action模式,这两种方案各有优劣。

对于方案一:如果给一个控件添加了多个Target-Action,会导致多次触发Click事件。

对于方案二:由于SDK为控件添加了一个默认触发类型的Action,因此,如果开发者在开发过程中使用UIControl类的allTargets或者allControlEvents属性进行逻辑判断,有可能会引入一些无法预料的问题。

2.2 逆向分析

iOS 使用代码触发button的点击事件:【 [btn sendActionsForControlEvents:UIControlEventTouchUpInside];】及教你找到按钮action

https://blog.csdn.net/z929118967/article/details/80782694

2.3 限制按钮的点击频率

文章地址:https://kunnan.blog.csdn.net/article/details/117352527

在项目开发中,会对数据库数据进行更新操作的接口请求,不仅服务器侧需要控制请求频率以及保证数据的唯一性和一致性,app侧也需要进行限制来避免测试垃圾数据

原理:利用runtime API 对UIButton方法sendAction:to:forEvent:进行方法实现的交换,来控制事件的响应频率

SEL selA = @selector(sendAction:to:forEvent:);

III、知识储备:什么是响应者链?

iOS触摸事件:什么是响应者链?

https://kunnan.blog.csdn.net/article/details/74107917

see also

目录
相关文章
|
设计模式 测试技术 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(1)
283 0
|
设计模式 搜索推荐 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
546 1
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(7)
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
457 0
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(3)
|
设计模式 API iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(2)
312 0
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(6)
284 0
|
设计模式 iOS开发 UED
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(4)
280 0
|
设计模式 iOS开发
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
带你读《2022技术人的百宝黑皮书》——淘宝iOS扫一扫架构升级 - 设计模式的应用(5)
284 0
|
1月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
3月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
1月前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###