IOS 委托和协议区别和联系 (=)

Wesley13
• 阅读 595

上一片大致说了一下IOS上面委托和协议的区别和联系,并且举了一个简单的例子,但是例子比较简单,今天做一个用委托模拟button回调的例子。

在一个自定义View上面放一个登陆按钮,并且这个LoginView里面有一个实现ILogin的委托对象,在登陆按钮的点击事件中调用需要实现的协议函数。在一个ViewController中实现ILgin协议,并实现login方法。将自定义LoginView放到ViewController中,这时候点击button按钮,回自动调用login方法;这时候在ViewController中并没有看到直接调用login方法的地方,好像系统的回调一样。

代码实现:

ILogin.h

#import <Foundation/Foundation.h>

@protocol ILogin <NSObject>

@required
- (void)login;

@optional

@end

自定义View LoginView

#import <UIKit/UIKit.h>
#import "ILogin.h"

@interface LoginView : UIView

@property (nonatomic)id<ILogin> delegate;
@end

#import "LoginView.h"

@implementation LoginView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        
        UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button setFrame:CGRectMake(30, 60, 150, 45)];
        [button setTitle:@"LoginView登陆" forState:UIControlStateNormal];
        [button addTarget:self action:@selector(submitClick) forControlEvents:UIControlEventTouchUpInside];
        [self addSubview:button];
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

- (void)submitClick{
    //这里注意,调用实现协议的类的login方法
    [self.delegate login];
}

@end

ViewController

#import <UIKit/UIKit.h>
#import "ILogin.h"

@interface ViewController : UIViewController<ILogin>

@end

#import "ViewController.h"
#import "LoginView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
   LoginView *loginView=[[LoginView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 300)];
    loginView.delegate=self;
    [self.view addSubview:loginView];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


#pragma mark - ILogin 协议实现
- (void)login{
    NSLog(@"实现协议函数调用!");
}
@end

点击button调用结果:  2013-08-08 19:49:43.974 DelegateDemo[2205:c07] 实现协议函数调用!

现在你看到的现象好像是系统自动回调,但这是利用button按钮的系统回调在出现的,正常情况下我们一般是通过在实现协议的对象(ViewController)中声明委托人(LoginView)的对象,然后直接调用委托人的方法来实现回调,(注:委托人的方法中包含需要实现的协议方法)。这种方式应该是在IOS开发中经常用到的委托和协议组合。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
C#委托和事件
0\.前言事件和委托是C中的高级特性,也是C中很有意思的一部分。出现事件的地方,必然有委托出现;而委托则不一定会有事件出现。那为什么会出现这样的关系呢?这就需要从事件和委托的定义出发,了解其中的内在。1\.委托说起委托,就不得不回忆一下之前在Linq篇中介绍的匿名方法,其中提到了Func和Action这两个类型
Stella981 Stella981
3年前
Flask实战第52天:cms添加轮播图前端代码逻辑完成
首页我们在模态框中的保存按钮加一个id,这样方便我们选取这个按钮<buttontype"button"class"btnbtnprimary"id"savebannerbtn"保存</button在static/cms/js/下新建banners.js$(function(){$("
Wesley13 Wesley13
3年前
C#中委托和事件的区别
大致来说,委托是一个类,该类内部维护着一个字段,指向一个方法。事件可以被看作一个委托类型的变量,通过事件注册、取消多个委托或方法。本篇分别通过委托和事件执行多个方法,从中体会两者的区别。□通过委托执行方法classProgram{staticvoidMain(stringargs){
Stella981 Stella981
3年前
ExtJS表单提交时,不用鼠标点击按钮提交,直接通过回车键提交
用ExtJs实现登陆界面,输入用户名和密码,点击确定后登陆。然而人们习惯于在输入两者后按回车键进行登陆。在extjs中,Button本身是支持回车事件的,前提是:焦点在按钮上,此时回车和单击事件是一回事。form中的field事件中有specilkey事件,可以响应回车键。在输入用户名,或者密码后点击"回车",让field响应回车事件,然后通过form提
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这