《从零開始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器
实现目标与动作关联使用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设计模式及应用之选择器的更多相关文章
- 《从零开始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器
原创文章,欢迎转载.转载请注明:关东升的博客 实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法,示例代码如下: button.a ...
- 关东升的《从零开始学Swift》即将出版
大家好: 苹果2015WWDC大会发布了Swift2.0,它较之前的版本Swift1.x有很大的变化,所以我即将出版<从零开始学Swift> <从零开始学Swift>将在< ...
- Swift学习笔记(一)搭配环境以及代码运行成功
原文:Swift学习笔记(一)搭配环境以及代码运行成功 1.Swift是啥? 百度去!度娘告诉你它是苹果最新推出的编程语言,比c,c++,objc要高效简单.能够开发ios,mac相关的app哦!是苹 ...
- 关东升的《从零开始学Swift》3月9日已经上架
大家一直期盼的<从零开始学Swift>于3月9日已经上架,它是关东升老师历时8个月的呕心沥血所编著,全书600多页,此本书基于Swift 2.x,通过大量案例全面介绍苹果平台的应用开发.全 ...
- 【swift学习笔记】二.页面转跳数据回传
上一篇我们介绍了页面转跳:[swift学习笔记]一.页面转跳的条件判断和传值 这一篇说一下如何把数据回传回父页面,如下图所示,这个例子很简单,只是把传过去的数据加上了"回传"两个字 ...
- python之感知器-从零开始学深度学习
感知器-从零开始学深度学习 未来将是人工智能和大数据的时代,是各行各业使用人工智能在云上处理大数据的时代,深度学习将是新时代的一大利器,在此我将从零开始记录深度学习的学习历程. 我希望在学习过程中做到 ...
- 从零开始学Java——个人笔记(持续更新中)
从零开始学Java 学习流程 第一阶段:建立编程思想 Java概述 变量 运算符 控制结构 数组.排序和查找 面向对象编程(基础) 面向对象编程(中级) 项目&学习以致用 编程之乐 第二阶段: ...
- 《从零开始学Swift》学习笔记(Day 63)——Cocoa Touch设计模式及应用之单例模式
原创文章,欢迎转载.转载请注明:关东升的博客 什么是设计模式.设计模式是在特定场景下对特定问题的解决方案,这些解决方案是经过反复论证和测试总结出来的.实际上,除了软件设计,设计模式也被广泛应用于其他领 ...
- 《从零开始学Swift》学习笔记(Day67)——Cocoa Touch设计模式及应用之MVC模式
原创文章,欢迎转载.转载请注明:关东升的博客 MVC(Model-View-Controller,模型-视图-控制器)模式是相当古老的设计模式之一,它最早出现在Smalltalk语言中.现在,很多计算 ...
随机推荐
- C语言常见问题 如何用Visual Studio编写C语言程序测试
新建Win32控制台应用程序 勾选控制台空项目 右击源文件,添加cpp文件 输入范例代码,可以正常运行#include <stdio.h> int main(void) { i ...
- android中Snackbar(Design Support)的使用
Snackbar是Android Design Support Library中的一个组件,想使用Snackbar,必须先引入Design Support,我这里引入的是当前的最新版本: implem ...
- Linux中Sed的用法
Linux中Sed的用法 sed是一个很好的文件处理工具,本身是一个管道命令,主要是以行为单位进行处理,可以将数据行进行替换.删除.新增.选取等特定工作,下面先了解一下sed的用法sed命令行格式为: ...
- C++ 第十二课 其它标准C函数
abort() 停止程序执行 assert() 当表达式非真,停止程序执行 atexit() 当程序退出执行设定的程序 bsearch() 执行折半查找 exit() 停止程序执行 getenv() ...
- java获取cpu、内存、硬盘信息[转]
http://m.oschina.net/blog/312911 1 下载安装sigar-1.6.4.zip 使用java自带的包获取系统数据,容易找不到包,尤其是内存信息不够准确,所以选择使用sig ...
- stingray后端开发
stingray可是化后端开发架构 任何web应用的后端职能都是一样的:业务数据的增删改查.后端语言多种多样,但是唯一不变的就是SQL,你用Java也好,PHP,Python也好,最终操作数据库都是一 ...
- poj 1664 放苹果(递推)
题目链接:http://poj.org/problem? id=1664 放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- ANTLR#1:描述一个简单计算器
https://blog.csdn.net/kisimple/article/details/44948603
- urllib2特点--urllib2.Request对象,定制请求头部信息
# -*- coding: cp936 -*- #python 27 #xiaodeng #urllib2特点--urllib2.Request对象,定制请求 import urllib2 def r ...
- python模块之HTMLParser抓页面上的所有URL链接
# -*- coding: utf-8 -*- #python 27 #xiaodeng #python模块之HTMLParser抓页面上的所有URL链接 import urllib #MyParse ...