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

实现目标与动作关联使用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:self action: selector

           forControlEvents: 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, forEvent event: 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 sent to instance 0x7f7f81499b10'

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

  //选择器为"onClick:"

    @objc private func onClick(sender: AnyObject) {

        NSLog("onClick:")

    }

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台。了解最新技术文章、图书、教程信息
  ​

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" />
很多其它精品iOS、Cocos、移动设计课程请关注智捷课堂官方站点:http://www.zhijieketang.com
智捷课堂论坛站点:http://51work6.com/forum.php

《从零開始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器的更多相关文章

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

    原创文章,欢迎转载.转载请注明:关东升的博客 实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法,示例代码如下: button.a ...

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

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

  3. Swift学习笔记(一)搭配环境以及代码运行成功

    原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...

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

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

  5. 【swift学习笔记】二.页面转跳数据回传

    上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...

  6. python之感知器-从零开始学深度学习

    感知器-从零开始学深度学习 未来将是人工智能和大数据的时代,是各行各业使用人工智能在云上处理大数据的时代,深度学习将是新时代的一大利器,在此我将从零开始记录深度学习的学习历程. 我希望在学习过程中做到 ...

  7. 从零开始学Java——个人笔记(持续更新中)

    从零开始学Java 学习流程 第一阶段:建立编程思想 Java概述 变量 运算符 控制结构 数组.排序和查找 面向对象编程(基础) 面向对象编程(中级) 项目&学习以致用 编程之乐 第二阶段: ...

  8. 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式

    原创文章,欢迎转载.转载请注明:关东升的博客 什么是设计模式.设计模式是在特定场景下对特定问题的解决方案,这些解决方案是经过反复论证和测试总结出来的.实际上,除了软件设计,设计模式也被广泛应用于其他领 ...

  9. 《从零开始学Swift》学习笔记(Day67)——Cocoa Touch设计模式及应用之MVC模式

    原创文章,欢迎转载.转载请注明:关东升的博客 MVC(Model-View-Controller,模型-视图-控制器)模式是相当古老的设计模式之一,它最早出现在Smalltalk语言中.现在,很多计算 ...

随机推荐

  1. 高级NUMA参数

    Advanced NUMA Attributes You can use the advanced NUMA attributes to customize NUMA usage. Attribute ...

  2. C#和网页js互调代码

    C#和网页js互调代码 1.先写个网页放在主程序目录下:test.html <!DOCTYPE html> <html lang="en" xmlns=" ...

  3. eclipse 运行简单JAVA程序事例

    开发JAVA已经有一段时间了,不过要运行JAVA程序,还是在命令行敲命令,很不方便,很麻烦,突然想到eclipse应该也有这个功能,于是百度了一下,将步骤晒出来,供大家参考. 1.创建JAVA工程 单 ...

  4. mysql 俩个时间相减后取分钟

    CASE WHEN TIMESTAMPDIFF(MINUTE,o.createDate,o.chargingStartDate) != THEN 'APP解锁计费' ELSE '系统自动计费' END ...

  5. vba 列转行

    Sub C2R() Dim RCount As Integer RCount = 2 Dim FillIn, FillIn2 Set FillIn = Worksheets("Fill-in ...

  6. python object对象

    动态语言的对象属性 既然都是动态语言,自然python和熟知的JavaScript很像,建一个空对象用来存放所有的数据,看看js: var data = {}; data.name = 'CooMar ...

  7. sqlalchemy结果转json

    网上搜了下,http://blog.csdn.net/liu_xing_hui/article/details/8956107 介绍的很详细,自动一个Encoder给json的dump方法使用,能够实 ...

  8. 【HDU 5647】DZY Loves Connecting(树DP)

    pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...

  9. BIEE Demo(RPD创建 + 分析 +仪表盘 )

    说明:此Demo步骤简略,详细Demo可以参照下面的 天善视频:BIEE 11G Rpd模型设计 天善视频:BIEE 11G 报表开发 Oracle BIEE (Business Intelligen ...

  10. 索引唯一性扫描(INDEX UNIQUE SCAN)

           索引唯一性扫描(INDEX UNIQUE SCAN)是针对唯一性索引(UNIQUE INDEX)的扫描,它仅仅适用于where条件里是等值查询的目标SQL.因为扫描的对象是唯一性索引,所 ...