协议: 一套标准,方法,只声明了方法,没有实现,由接受协议的对象实现
协议本身,也可以服从其他协议
协议只有一个 .h 文件
协议能够变相的实现多继承
类:父类<协议>
UIScrollView 提供了屏幕滚动的功能,是所有滚动视图的基类,
#import
<UIKit/UIKit.h>
#import "TestProtocol.h"
@protocol ProtocolTest < NSObject > //NSObject 是一个协议
// 位置关键
// 协议 让类来接受 , 接受完需要实现被 @required 修饰的方法(此过程称为确认协议,遵守协议) , 在父类名后加 < 协议名 >
#import "TestProtocol.h"
@protocol ProtocolTest < NSObject > //NSObject 是一个协议
// 位置关键
// 协议 让类来接受 , 接受完需要实现被 @required 修饰的方法(此过程称为确认协议,遵守协议) , 在父类名后加 < 协议名 >
//
一个类可以遵守多个协议
,
写在同一个
<>
中
,
多个协议之间用逗号分隔
@required // 用 @required 修饰的方法代表必须实现 , 是默认的
- ( void)test1;
@optional // 用 @optional 修饰的方法代表可选实现
- ( void)test2;
- ( void)test3;
@end
@protocol WorkerProtocol < NSObject >
- ( void)work;
@end
@interface RootViewController : UIViewController< ProtocolTest, WorkerProtocol, TestProtocol >
@end
@required // 用 @required 修饰的方法代表必须实现 , 是默认的
- ( void)test1;
@optional // 用 @optional 修饰的方法代表可选实现
- ( void)test2;
- ( void)test3;
@end
@protocol WorkerProtocol < NSObject >
- ( void)work;
@end
@interface RootViewController : UIViewController< ProtocolTest, WorkerProtocol, TestProtocol >
@end
代理(是一种设计模式) delegate
某些功能,自己不实现,别人帮忙实现,"别人"就是自己的代理
#import
<Foundation/Foundation.h>
// 以后继承 , 协议的头文件在 .h 中引入
// 类的头文件在 .m 中引入
@protocol TestProtocol < NSObject]] >
@required
- ( void)testMethod1;
@optional
- ( void)testMethod2;
@end
// 以后继承 , 协议的头文件在 .h 中引入
// 类的头文件在 .m 中引入
@protocol TestProtocol < NSObject]] >
@required
- ( void)testMethod1;
@optional
- ( void)testMethod2;
@end
@interface Girl :
NSObject
//id<BeforeMarriedProtocol> 称为 基于类型的一个限定
// 想成为代理 , 必须遵守协议
@property ( nonatomic, assign) id< BeforeMarriedProtocol> delegate;
- ( void)hungry:( NSString *)wantEatName;
@end
//id<BeforeMarriedProtocol> 称为 基于类型的一个限定
// 想成为代理 , 必须遵守协议
@property ( nonatomic, assign) id< BeforeMarriedProtocol> delegate;
- ( void)hungry:( NSString *)wantEatName;
@end
@implementation Girl
- ( void)hungry:( NSString *)wantEatName
{
//if([_delegate respondsToSelector:@selector(doHouseWork)])
// 做完家务才做饭
if ([ _delegate doHouseWork]) {
// 判断某个对象是否实现了某个方法
// 运行时绑定
if ([ _delegate respondsToSelector: @selector(doCook:)]) {
// 回调
[ _delegate doCook:wantEatName];
}
}
}
@end
- ( void)hungry:( NSString *)wantEatName
{
//if([_delegate respondsToSelector:@selector(doHouseWork)])
// 做完家务才做饭
if ([ _delegate doHouseWork]) {
// 判断某个对象是否实现了某个方法
// 运行时绑定
if ([ _delegate respondsToSelector: @selector(doCook:)]) {
// 回调
[ _delegate doCook:wantEatName];
}
}
}
@end
UITextField * tf = [[
UITextField
alloc]
initWithFrame:
CGRectMake(
20,
50,
280,
30)];
tf. borderStyle = UITextBorderStyleLine;
tf. delegate = self;
[ self. view addSubview:tf];
[tf release];
tf. borderStyle = UITextBorderStyleLine;
tf. delegate = self;
[ self. view addSubview:tf];
[tf release];
//textField
被委托方
,
根视图控制器
,
委托方
// 代理方法
- ( BOOL)textFieldShouldReturn:( UITextField *)textField
{
// 处理用户的触摸事件
NSLog( @"ShouldReturn");
[textField resignFirstResponder];
return YES;
}
- ( BOOL)textFieldShouldBeginEditing:( UITextField *)textField
{
NSLog( @"ShouldBeginEditing");
return YES;
}
// 代理方法
- ( BOOL)textFieldShouldReturn:( UITextField *)textField
{
// 处理用户的触摸事件
NSLog( @"ShouldReturn");
[textField resignFirstResponder];
return YES;
}
- ( BOOL)textFieldShouldBeginEditing:( UITextField *)textField
{
NSLog( @"ShouldBeginEditing");
return YES;
}