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

实现目标与动作关联使用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_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
                          ​
更多精品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:)方法,演示样例代码例如以下: butt ...

  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. Python操作redis系列以 哈希(Hash)命令详解(四)

    # -*- coding: utf-8 -*- import redis #这个redis不能用,请根据自己的需要修改 r =redis.Redis(host=") 1. Hset 命令用于 ...

  2. Refresh Tokens: When to Use Them and How They Interact with JWTs

    In this post we will explore the concept of refresh tokens as defined by OAuth2. We will learn why t ...

  3. unity, animator stateMachine立即触发状态转换

    例如按下键jump按钮人物执行跳起动作,同时动画状态由idle转换为jump,同时打开Game窗口和Animator窗口对比观察,发现人物跳起时动画状态并没有同步发生转换,而是有一定延迟,导致人物动画 ...

  4. cocos2d-x中的宏定义CC_PROPERTY

    cocos2d-x定义了很多宏定义,帮我们提高开发效率,下面看下CC_PROPERTY, CC_PROPERTY定义 CC_PROPERTY的声明在CCPlatformMacros.h中,结构如下 # ...

  5. Centos Java 从1.7升级为1.8

    查看安装的sdk版本 yum list installed |grep java 卸载JDK相关文件输入和tzdata-java输入 yum -y remove java-1.7.0-openjdk* ...

  6. Struts2使用OGNL遍历各种map总结

    一.Action中的代码:MapAction.java package com.zx.demo.action; import java.util.ArrayList;   import java.ut ...

  7. python 获取当前时间的用法

    1.先导入库:import datetime 2.获取当前日期和时间:now_time = datetime.datetime.now() 3.格式化成我们想要的日期:strftime() 比如:“2 ...

  8. Nginx - rewrite 不区分大小写进行匹配

    Nginx - rewrite 不区分大小写进行匹配 分类: Nginx2014-05-28 19:25 1046人阅读 评论(0) 收藏 举报 Use (?i) to match case-inse ...

  9. logcat的调试 比较有用的几个命令

    网上很多的logcat调试命令,但是太多的命令只会令人盐杂. (主要是adt工具带的调试功能容易死掉 每次都要重启太烦) 个人认为有一下几个常用命令: adb logcat -c 清除所有以前的日志 ...

  10. FreeRTOS 消息队列

    以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息 ...