原创文章,欢迎转载。转载请注明:关东升的博客

实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法,示例代码如下:

button.addTarget(self,action: "onClick:", forControlEvents: UIControlEvents.TouchUpInside)

其中的action参数"onClick:"事实上就是选择器(Selector)。

问题提出

任何能够将方法调用的绑定推迟到运行期,在编译时方法调用者不需要知道要调用的方法是什么,这个可以降低调用者与被调用者之间的耦合度,这样就语言就很灵活。在C语言在提供一种函数指针技术,Objective-C和Swift语言都提供选择器(Selector)类型,它是C语言函数指针的面向对象替代技术。

选择器在Cocoa和Cocoa Touch中的目标动作、通知和委托等模式中方法的调用实现的关键。

解决方案

Objective-C中选择器是SEL数据类型,使用@selector()语句调用,调用onClick:方法的Objective-C示例代码如下:

SEL selector = @selector(onClick:);
[button addTarget:selfaction: selectorforControlEvents:UIControlEventTouchUpInside];

Swift中虽然没有提供SEL数据类型,而是提供了Selector结构体,通过方法名字符串构建Selector实例,示例代码如下:

button.addTarget(self,action: Selector("onClick:"), forControlEvents: UIControlEvents.TouchUpInside)

通过选择器调用方法,关键是方法名字,它有一定规律的。穷其根本是源自于Objective-C多重参数方法命名规律。方法名的冒号暗示了方法名应该具有几个参数,下面我们看几个示例:

 //选择器为"onClick:"func onClick(sender: AnyObject) {NSLog("onClick:")}//选择器为"onClick:forEvent:"func onClick(sender: AnyObject, forEventevent: UIEvent) {    NSLog("onClick:forEvent:")}//选择器为"onClickWithExtSender:forEvent:"func onClick(extSender sender: AnyObject,forEvent event: UIEvent) {NSLog("onClickWithExtSender:forEvent:")}

出于数据封装的需要,我们会在方法前面加private,使其变为私有方法,代码如下。

 private func onClick(sender: AnyObject) {NSLog("onClick:")}

但是这样方法在调用时候会出现如下错误:

unrecognized selector sentto instance 0x7f7f81499b10'

这个错误的意思是没有找到选择器所指定的方法,也就是没有找到onClick:方法。正确的做法是在方法前面添加@objc属性注释,这说明选择器是在objc runtime运行环境下调用的。

 //选择器为"onClick:"@objc private func onClick(sender:AnyObject) {NSLog("onClick:")}

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
                             
更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php

《从零开始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器相关推荐

  1. 从零开始学STM32(学习笔记——第三天)

    CSDN话题挑战赛第2期 参赛话题:学习笔记 参考文章: [教学文章]STM32内部重要功能全记录 [教学文章]STM32内部核心功能大揭秘 [教学文章]STM32内部重要功能全记录 框架:STM32 ...

  2. 关东升的《从零开始学Swift》

    这个博文是swift 2.0的,也是可以参考的 http://blog.csdn.net/tonny_guan/article/category/6139217 文章目录 [置顶] 关东升的<从 ...

  3. 【从零开始学深度学习编译器】十二,MLIR Toy Tutorials学习笔记一

    本笔记由学习MLIR Tutorials总结而成,欢迎批评指正. Chapter1: Toy语言和AST MLIR提供了一种Toy语言来说明MLIR的定义和执行的流程.Toy语言是一种基于张量的语言, ...

  4. 关东升的《从零开始学Swift》即将出版

    大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift><从零开始学Swift>将在< ...

  5. 关东升的《从零开始学Swift》3月9日已经上架

    大家一直期盼的<从零开始学Swift>于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发.全 ...

  6. 【从零开始学深度学习编译器】十三,如何在MLIR里面写Pass?

    [GiantPandaCV导语]这篇文章是学习了比较久然后按照自己的理解步骤重新总结了下来,主要是MLIR Toy Tutorials第3,4篇文章的内容.这里主要讲解了如何在MLIR中自定义Pass ...

  7. 动手学深度学习笔记3.4+3.5+3.6+3.7

    系列文章目录 动手学深度学习笔记系列: 动手学深度学习笔记3.1+3.2+3.3 文章目录 系列文章目录 前言 一.softmax回归 1.1 分类问题 1.2 网络架构 1.3 全连接层的参数开销 ...

  8. 影像组学视频学习笔记(43)-标准差、标准误及95%置信区间CI、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/f09d0f97592f 来源:简书,已获授权转载 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(43)主要 ...

  9. 影像组学视频学习笔记(42)-影像组学特征提取问题解决过程复现、Li‘s have a solution and plan.

    作者:北欧森林 链接:https://www.jianshu.com/p/c3e6de2f79b3 来源:简书,已获转载授权 本笔记来源于B站Up主: 有Li 的影像组学系列教学视频 本节(42)主要 ...

最新文章

  1. C#线程系列(3):线程池和文件下载服务器
  2. Go语言垃圾回收(GC)
  3. 永远不要去依赖别人_心理学:永远不要穿别人剩下的旧衣服,这三点原因读来让人愧疚...
  4. java20 创建服务器:ServerSocket
  5. java eventbus 原理_事件总线,事件驱动(RxJava,EventBus)与广播(BroadcastReceiver)(2)
  6. Activiti7的用法和简述
  7. 如何注册谷歌账号、邮箱(22.8.23亲测可用)
  8. 非易失内存技术NVDIMM
  9. QT下的几种透明效果
  10. 硅谷最牛程序员,总是不经意间碾压众人
  11. 【java】eclipse
  12. 实例甜点 Unreal Engine 4迷你教程(4)之用C++实现添加子Widget到VerticalBox中以及ClearChildren...
  13. 深度学习工作站搭建全过程
  14. Python实现BBS自动登录并发帖
  15. 如何辨别上市公司财务造假
  16. 基于Halcon学习的二维码识别【一】micro_qr_simple.hdev
  17. Endnote 20(X9)中英文文献引用(毕业论文格式)-自用
  18. 基于多元线性回归算法的5G基站能耗模型
  19. sim7600ce 拨号上网测试_Linux下sim7600ce调试笔记
  20. 【翻译】Aggregated Residual Transformations for Deep Neural Networks

热门文章

  1. 微博运营与微博营销最易犯的20种错误,你犯了吗?
  2. python3 urllib
  3. 第7章 面向对象编程(OOP) 《Kotin 编程思想·实战》
  4. 微信小程序下拉筛选菜单WXDropDownMenu组件
  5. ITextHtml2canvas js截图 绘制 导出PDF
  6. MySQL事物系列:1:事物简介
  7. SQL点滴31—SQL语句中@@IDENTITY和@@ROWCOUNT区别
  8. nginx 开启ssi
  9. 大学学习方法介绍之:使用两套教材
  10. struts2中报错404 No result defined for action com.jcrj.ahsfjd.ajgl.JdshAction and result input解决方法...