`

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

阅读更多

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

 

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

 

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

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

 

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

 

问题提出

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

选择器在CocoaCocoa 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:")
    }
 
 

 

 

 

  • 大小: 20.5 KB
分享到:
评论

相关推荐

    Swift从入门到精通视频教程下载第20章 开发iOS应用程序的基石——CocoaTouch框架.zip

    Swift编程语言以其强大的功能和易读性在iOS应用开发领域占据了一席之地,而CocoaTouch框架则是构建iOS应用程序的核心工具。本视频教程将引导您深入理解CocoaTouch,并逐步掌握开发iOS应用的关键技巧。 首先,Cocoa...

    iOS and macOS Performance Tuning Cocoa, Cocoa Touch, Objective-C, and Swift

    本书主要针对苹果的两大操作系统平台,即iOS和macOS,提供了丰富的实践经验和专业指导,帮助开发者在使用Cocoa、Cocoa Touch、Objective-C和Swift开发应用时实现最佳性能。 首先,Cocoa和Cocoa Touch是苹果为macOS...

    设计模式在Cocoa中的应用

    在Cocoa框架中,设计模式扮演着至关重要的角色,它们为开发者提供了标准的解决常见问题的方法,提高了代码的可读性和可维护性。Cocoa基于Objective-C,这门语言支持面向对象特性,如消息传递、类别和协议,使得实现...

    swift Cocoa编程教程

    3. **Cocoa设计模式**:Cocoa遵循Model-View-Controller (MVC)架构模式,将应用程序分为模型、视图和控制器三个部分。理解MVC的原理和实践是Cocoa编程的关键。 4. **Interface Builder**:这是Apple的可视化设计...

    COCOA设计模式 完整版 中文版

    《COCOA设计模式 完整版 中文版》是一本专为iOS开发者深度学习COCOA框架而准备的高级进阶书籍。COCOA,全称“Cocoa Touch”,是Apple开发的用于构建iOS应用的主要框架,它包含了Objective-C和Swift编程语言中的大量...

    Swift.Development.with.Cocoa.2014.12[原版]

    通过阅读本书,读者能够学会如何利用Swift语言,结合Cocoa和Cocoa Touch框架,创建适用于iPhone、iPad和Mac的应用程序。该书提供了大量实际案例,介绍了如何在真实世界场景中使用Swift语言进行编程,并通过实践练习...

    swift 与 cocoa 框架研发 源码

    3. **Cocoa设计模式**:学习Cocoa的 MVC(模型-视图-控制器)、MVVM(模型-视图-视图模型)和VIPER(视图-交互器- presenter-实体-路由)等设计模式。 4. **Cocoa Touch和AppKit**:了解iOS上的UIKit和macOS上的...

    移动软件开发-3期(KC015) 拓展学习-Cocoa Touch.pdf

    Cocoa Touch是iOS应用开发的核心组成部分,它是Apple为移动设备设计的一个框架,主要负责处理用户交互、图形界面和应用程序的基本结构。Cocoa Touch是从Mac OS X的Cocoa框架发展而来,经过优化以适应触摸屏操作和...

    iOS 11 Programming Fundamentals with Swift Swift, Xcode, and Cocoa Basics azw3

    iOS 11 Programming Fundamentals with Swift Swift, Xcode, and Cocoa Basics 英文azw3 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除

    IOS应用源码——netshade-Cocoa-Touch-Barcodes-dfde76f.zip

    《iOS应用源码解析:netshade-Cocoa-Touch-Barcodes-dfde76f》 在iOS开发领域,源码是学习和理解技术的关键。"netshade-Cocoa-Touch-Barcodes-dfde76f.zip"这个压缩包包含了iOS应用的源代码,专门涉及到Cocoa Touch...

    leetcode耗时-iOS-Apps:存储我迄今为止使用Swift和SwiftUI框架/CocoaTouch库编写的所有iOS应用程序的存储

    leetcode ...文件类型,然后将其转换为为应用程序设计的类。 Monshot - 应用程序存储有关人类历史上发生的每个月球任务的信息。 它显示有关任务本身以及宇航员的数据。 一切都存储为 JSON 文件。 练习乘法-

    Swift与Cocoa框架开发-课件源文件

    4. **Model-View-Controller (MVC)**:Cocoa和Cocoa Touch都遵循MVC设计模式,这是一种将数据模型、视图和控制器分离的设计思想,有利于代码组织和维护。 5. **Auto Layout**和Size Classes:用于在不同屏幕尺寸和...

    IOS应用源码——robin-cocoa-web-resource-8f47f25.rar

    《iOS应用源码解析——深度探索robin-cocoa-web-resource-8f47f25》 在iOS开发中,源码是理解应用程序工作原理的关键。"robin-cocoa-web-resource-8f47f25"是一个专门针对iOS应用的源码库,它包含了用于构建iOS应用...

    Cocoa Touch:UIKit

    Cocoa Touch是Apple iOS开发的核心组成部分,其主要的UI构建框架就是UIKit。UIKit提供了一系列的类和接口,用于创建和管理iOS应用的用户界面、处理用户交互以及进行系统级别的任务。在iOS开发中,开发者通常会用到...

    iOS实例开发源码——cocoa-fluff-CoolrSwap-b590080.zip

    iOS实例开发源码——cocoa-fluff-CoolrSwap-b590080.zip

    cocoa设计模式(亲测清晰)

    通过阅读这本书,开发者不仅能了解到Cocoa中的设计模式,还能学习到如何在实际项目中灵活应用这些模式。书中可能还涵盖了模式间的组合和交互,以及如何根据项目需求进行模式选择和创新。掌握这些知识,对于成为一位...

    Cocoa Touch for iPhone OS 3 (pdf 书及源代码)

    Cocoa Touch for iPhone OS 3 (pdf 书及源代码) Join the gold rush to developing cool iPhone apps with this complete iPhone OS 3 developer’s guide. Professional developer Jiva DeVoe speaks your ...

Global site tag (gtag.js) - Google Analytics