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

实现目标与动作关联使用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. C语言常见问题 如何用Visual Studio编写C语言程序测试

    新建Win32控制台应用程序   勾选控制台空项目   右击源文件,添加cpp文件   输入范例代码,可以正常运行#include <stdio.h> int main(void) { i ...

  2. android中Snackbar(Design Support)的使用

    Snackbar是Android Design Support Library中的一个组件,想使用Snackbar,必须先引入Design Support,我这里引入的是当前的最新版本: implem ...

  3. Linux中Sed的用法

    Linux中Sed的用法 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: ...

  4. C++ 第十二课 其它标准C函数

    abort() 停止程序执行 assert() 当表达式非真,停止程序执行 atexit() 当程序退出执行设定的程序 bsearch() 执行折半查找 exit() 停止程序执行 getenv() ...

  5. java获取cpu、内存、硬盘信息[转]

    http://m.oschina.net/blog/312911 1 下载安装sigar-1.6.4.zip 使用java自带的包获取系统数据,容易找不到包,尤其是内存信息不够准确,所以选择使用sig ...

  6. stingray后端开发

    stingray可是化后端开发架构 任何web应用的后端职能都是一样的:业务数据的增删改查.后端语言多种多样,但是唯一不变的就是SQL,你用Java也好,PHP,Python也好,最终操作数据库都是一 ...

  7. poj 1664 放苹果(递推)

    题目链接:http://poj.org/problem? id=1664 放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions ...

  8. ANTLR#1:描述一个简单计算器

    https://blog.csdn.net/kisimple/article/details/44948603

  9. urllib2特点--urllib2.Request对象,定制请求头部信息

    # -*- coding: cp936 -*- #python 27 #xiaodeng #urllib2特点--urllib2.Request对象,定制请求 import urllib2 def r ...

  10. python模块之HTMLParser抓页面上的所有URL链接

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser抓页面上的所有URL链接 import urllib #MyParse ...