Protocol协议 按钮点击

简介:
要求:用协议模拟实现按钮的点击事件
Button.h
#import <Foundation/Foundation.h> @class  Button;  //<>表示实现了某个协议 @protocol ButtonDelegate <NSObject> -(void)onClick:(Button *)btn; @end  @interface Button : NSObject //delegate就是按钮的监听器  <>里面就是指上面的那个协议 @property(nonatomic,retain) id<ButtonDelegate> delegate; -(void)click; @end

Button.m:
#import "Button.h"  @implementation Button  -(void)click{     //如果delegate实现了     if([_delegate respondsToSelector:@selector(onClick:)])     {         //按钮被点击了,就应该通知监听器         [_delegate onClick:self];     }     else     {         NSLog(@"监听器并没有实现onClick:方法");     } }  -(void)dealloc{     [_delegate release];     [super dealloc]; } @end 

MyListener.h:
#import <Foundation/Foundation.h> #import "Button.h"  @interface MyListener : NSObject<ButtonDelegate>  @end

MyListener.m:
#import "MyListener.h" #import "Button.h"  @implementation MyListener -(void)onClick:(Button *)btn{     NSLog(@"已经监听到按钮:%@点击了",btn); } @end

ButtonListener.h:
#import <Foundation/Foundation.h> #import "Button.h" //一个类要遵守一个协议,要用<>来添加协议名称 @interface ButtonListener : NSObject<ButtonDelegate>  @end

ButtonListener.m:
#import "ButtonListener.h"  @implementation ButtonListener -(void)onClick{     NSLog(@"按钮被点击了"); } @end

Main:
#import <Foundation/Foundation.h> #import "Button.h" #import "ButtonListener.h" #import "MyListener.h"  int main(int argc, const char * argv[]) {      @autoreleasepool {         //初始化一个按钮         Button *btn=[[[Button alloc] init] autorelease];         //初始化一个按钮监听器         ButtonListener *btnListener=[[[ButtonListener alloc] init] autorelease];         MyListener * mylisten=[[[MyListener alloc] init] autorelease];         //将这个监听器给按钮         btn.delegate=btnListener;         [btn click];         NSLog(@"当前按钮是%@",btn);         btn.delegate=mylisten;         [btn click];     }     return 0; }
结果:

2013-08-02 14:47:26.352 Protocol[656:303] 监听器并没有实现onClick:方法

2013-08-02 14:47:26.353 Protocol[656:303] 当前按钮是<Button: 0x100109940>

2013-08-02 14:47:26.354 Protocol[656:303] 已经监听到按钮:<Button: 0x100109940>点击了























本文转自蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366483 ,如需转载请自行联系原作者

相关文章
|
11月前
|
机器学习/深度学习 数据采集 人工智能
《智能算法设计与开发的全解析:从理念到实践》
在数字化时代,智能算法作为人工智能的核心驱动力,广泛应用于各行业。设计时需坚持目标导向、数据驱动、平衡复杂性与可解释性、确保鲁棒性;开发中要合理选择算法、编程语言与工具,注重模型训练、验证和部署维护。实践要点包括保证数据质量、综合评估模型、结合领域知识及团队协作。持续学习新技术也至关重要。
383 11
|
12月前
|
物联网 开发工具 Android开发
《鸿蒙HarmonyOS应用开发从入门到精通(第2版)》学习笔记——HarmonyOS产生的背景
HarmonyOS是华为自主研发的分布式操作系统,旨在应对美国“实体清单”带来的技术封锁。2019年首次亮相,它不仅支持手机、平板等多终端设备,还通过统一的软件系统解决了不同设备间的体验割裂问题。HarmonyOS强调全场景智能互联,提升设备间的安全性和协同能力。其商用版本基于OpenHarmony开源项目开发,而HarmonyOS NEXT则是去除了AOSP代码的纯自研版本,代表了未来发展方向。
630 12
|
12月前
|
存储 缓存 运维
阿里云先知安全沙龙(上海站)——后渗透阶段主机关键信息自动化狩猎的实现与应用
本文介绍了在后渗透测试中使用LSTAR工具和PowerShell脚本进行RDP状态查询、端口获取及凭据收集的过程,强调了高强度实战场景下的OPSEC需求。通过MITRE ATT&CK框架的应用,详细阐述了凭证访问、发现和收集等关键技术,确保攻击者能够隐蔽、持续且高效地渗透目标系统,最终获取核心数据或控制权。文中还展示了SharpHunter等工具的自动化实现,进一步提升了操作的安全性和效率。
|
12月前
|
前端开发 JavaScript C#
基于.NET8+Vue3开发的权限管理&个人博客系统
基于.NET8+Vue3开发的权限管理&个人博客系统
183 7
|
12月前
|
关系型数据库 MySQL 数据库
市场领先者MySQL的挑战者:PostgreSQL的崛起
PostgreSQL(简称PG)是世界上最先进的开源对象关系型数据库,起源于1986年的加州大学伯克利分校POSTGRES项目。它以其丰富的功能、强大的扩展性和数据完整性著称,支持复杂数据类型、MVCC、全文检索和地理空间数据处理等特性。尽管市场份额略低于MySQL,但PG在全球范围内广泛应用,受到Google、AWS、Microsoft等知名公司支持。常用的客户端工具包括PgAdmin、Navicat和DBeaver。
809 4
|
存储 编解码 API
BackTrader 中文文档(四)(1)
BackTrader 中文文档(四)
247 1
|
存储 缓存 监控
优化 Electron-store 存储性能
【10月更文挑战第18天】优化存储性能是一个持续的过程,需要我们不断地关注和改进。通过合理的规划和措施,我们可以充分发挥 Electron-store 的优势,为用户提供更加流畅和高效的使用体验。
|
机器学习/深度学习 自然语言处理 数据可视化
开箱即用!智能文档处理“百宝箱“
10 月 24 日至 26 日,CSDN 第五届“1024 程序员节”在长沙召开。合合信息的常扬老师分享了智能文档处理“百宝箱”,包括 TextIn ParseX、acge-embedding 和 markdown_tester 三种工具。这些工具解决了文档解析中的版式复杂、解析错误、语义信息丢失等问题,适用于文字工作者和机器学习研究人员。TextIn ParseX 是一个可视化工具,支持多种格式输出,acge-embedding 模型用于文本向量化,而 markdown_tester 则用于文档解析效果的定量评估。
252 0
|
存储 JavaScript
vue3 setup语法糖 多条件搜索(带时间范围)
vue3 setup语法糖 多条件搜索(带时间范围)
422 0
|
网络协议
Internet的形成与发展
Internet的形成与发展。
927 1

热门文章

最新文章