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

简介:

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

1
2
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示例代码如下:

1
2
3
SEL selector =  @selector (onClick:);
[button addTarget:selfaction: selector
           forControlEvents:UIControlEventTouchUpInside];


    Swift中虽然没有提供SEL数据类型,而是提供了Selector结构体,通过方法名字符串构建Selector实例,示例代码如下:

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


    通过选择器调用方法,关键是方法名字,它有一定规律的。穷其根本是源自于Objective-C多重参数方法命名规律。方法名的冒号暗示了方法名应该具有几个参数,下面我们看几个示例:

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  //选择器为"onClick:"
     func onClick(sender: AnyObject) {
         NSLog( "onClick:" )
     }
     
     //选择器为"onClick:forEvent:"
     func onClick(sender: AnyObject, forEventevent: UIEvent) {    
         NSLog( "onClick:forEvent:" )
     }
     
     //选择器为"onClickWithExtSender:forEvent:"
     func onClick(extSender sender: AnyObject,forEvent event: UIEvent) {
        NSLog( "onClickWithExtSender:forEvent:" )
     }


 

出于数据封装的需要,我们会在方法前面加private,使其变为私有方法,代码如下。

   

1
2
3
  private  func onClick(sender: AnyObject) {
         NSLog( "onClick:" )
     }


但是这样方法在调用时候会出现如下错误:

1
unrecognized selector sentto instance  0x7f7f81499b10 '


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

   

1
2
3
4
  //选择器为"onClick:"
     @objc  private  func onClick(sender:AnyObject) {
         NSLog( "onClick:" )
     }


 


本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1748676,如需转载请自行联系原作者

相关文章
|
6天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
29天前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
|
29天前
|
设计模式 缓存 安全
代码的艺术:如何用设计模式打造优雅的Java应用
【4月更文挑战第7天】本文介绍了提升Java代码质量的七个设计模式:单例(Singleton)、工厂方法、抽象工厂、建造者、原型、适配器和观察者模式。这些模式分别用于资源管理、对象创建、接口兼容和消息传递等场景,旨在增强代码的灵活性、可读性和可维护性。掌握并适时应用设计模式,能帮助开发者打造高效、优雅的软件作品。
|
4天前
|
设计模式 存储 前端开发
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
18:JavaBean简介及其在表单处理与DAO设计模式中的应用-Java Web
20 4
|
6天前
|
存储 Swift iOS开发
使用Swift开发一个简单的iOS应用的详细步骤。
使用Swift开发iOS应用的步骤包括:创建Xcode项目,设计界面(Storyboard或代码),定义数据模型,实现业务逻辑,连接界面和逻辑,处理数据存储(如Core Data),添加网络请求(必要时),调试与测试,根据测试结果优化改进,最后提交至App Store或其它平台发布。
18 0
|
6天前
|
机器学习/深度学习 数据采集 TensorFlow
【Swift开发专栏】Swift与机器学习:构建智能应用
【4月更文挑战第30天】本文探讨了使用Swift开发机器学习应用,分为三个部分:机器学习基础(定义、类型及应用),Swift在机器学习中的作用(Swift for TensorFlow、Core ML及性能优势),以及实践技巧(数据预处理、特征工程、模型训练与部署、性能优化和用户界面集成)。通过学习,开发者能掌握构建智能应用的技能,利用Swift的性能和安全性提升应用效率。随着深入学习,开发者可探索更多高级特性和技术,如深度学习和复杂数据分析。
|
6天前
|
存储 API Swift
【Swift开发专栏】Swift函数与闭包的实战应用
【4月更文挑战第30天】本文介绍了 Swift 中函数和闭包的实战应用。首先,函数的基本使用包括定义、参数与返回值、函数类型以及高级技巧如嵌套函数。接着,讨论了闭包的语法,包括无名函数、作为函数参数、简写形式和尾随闭包。最后,展示了函数和闭包在实战中的应用,如排序过滤集合和处理异步任务的回调。
|
6天前
|
缓存 Swift UED
【Swift开发专栏】Swift应用的启动优化
【4月更文挑战第30天】本文介绍了Swift应用启动优化技巧,包括优化代码结构和资源加载。建议减少启动时加载的代码,采用延迟加载、分模块加载和懒加载策略;优化初始化代码,注意顺序、异步初始化和避免全局初始化。对于资源,压缩图片、使用矢量图和图片缓存可提升加载速度。文中还提供了实战案例,展示如何在代码中实施这些优化措施。
|
6天前
|
安全 Swift iOS开发
【Swift 开发专栏】Swift 与 UIKit:构建 iOS 应用界面
【4月更文挑战第30天】本文探讨了Swift和UIKit在构建iOS应用界面的关键技术和实践方法。Swift的简洁语法、类型安全和高效编程模型,加上与UIKit的紧密集成,使开发者能便捷地创建用户界面。UIKit提供视图、控制器、布局、动画和事件处理等功能,支持灵活的界面设计。实践中,遵循设计原则,合理组织视图层次,运用布局和动画,以及实现响应式设计,能提升界面质量和用户体验。文章通过登录、列表和详情界面的实际案例展示了Swift与UIKit的结合应用。
|
6天前
|
缓存 算法 Swift
【Swift 开发专栏】Swift 应用的性能优化技巧
【4月更文挑战第30天】本文探讨了Swift应用性能优化,强调理解性能瓶颈、针对性优化和平衡性能与代码质量的重要性。提出优化技巧,包括选择合适数据结构、避免不必要的对象创建、使用缓存、优化算法、减少计算、管理内存、利用多核处理、优化网络请求和界面渲染。通过实际案例分析证明了这些方法能有效提升应用性能和用户体验。开发者应持续关注新技术和方法,以适应不断提升的性能要求。