协议: 一套标准,方法,只声明了方法,没有实现,由接受协议的对象实现
协议本身,也可以服从其他协议
协议只有一个 .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;
}