刚开始接触iOS,对delegate、protocol这两个概念比较模糊。参考了一些资料,记录下来体会。
@protocol myProtocol
@required
- (int)add:(int) a and:(int)b;
@optional
- (int)minus:(int)a and:(int)b;
@end
这里还有两个关键字,@required和@optional,一个是必须实现的,一个是可选的。可以根据名字直接判断。
@interface text : NSObject
@end
定义一个类来使用protocol,用尖括号(<...>)括起来的就是我们定义的protocol,如果要采用多个Protocol,可以在尖括号内引入多个Protocol名称,并用逗号隔开即可。
@implementation text
- (int)add:(int)a and:(int)b{
return a + b;
}
- (int)minus:(int)a and:(int)b{
if (a >= b) {
return a - b;
}
else
return b - a;
}
@end
#import
@protocol queryDelegate
- (NSString *)query;
@end
@interface Person1 : UIViewController
@end
- (NSString *)query{
NSString * result = [NSString stringWithFormat:@"热火赢太阳:103比98"];
return result;
}
#import
#import "Person1.h"
@interface Person2 : UIViewController
@end
- (NSString *)query{
NSString * data =[NSString stringWithFormat:@"詹姆斯的数据是37分9篮板3助攻" ];
return data;
}
#import
#import "Person1.h"
#import "Person2.h"
@interface delegateViewController : UIViewController
@property (weak,nonatomic) id delegate;//声明delegate
- (IBAction)button1Action:(id)sender;
- (IBAction)button2Action:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *labelResult;
@property (weak, nonatomic) IBOutlet UILabel *labelData;
@end
#import "delegateViewController.h"
@interface delegateViewController ()
@end
@implementation delegateViewController
@synthesize labelData;
@synthesize labelResult;
.....
- (IBAction)button1Action:(id)sender {
Person1 *pe1 = [[Person1 alloc] init];
self.delegate = pe1;//设置代理对象为person1
NSString * result = [self.delegate query];//通过委托变量调用委托方法
[labelResult setText:result];
}
- (IBAction)button2Action:(id)sender {
Person2 *pe2 = [[Person2 alloc]init];
self.delegate = pe2;//设置代理对象为person2
NSString* data = [self.delegate query] //通过委托变量调用委托方法
[labelData setText:data];
}
@interface ClassC {
id delegate;
}
@end
首先定义一个id类型的变量,名字叫做delegate。那么ClassC的实现(.m文件)里就可以用delegate这个变量了。当然这里完全可以用其它名字而不是delegate。
@interface ClassC {
ClassB *delegate;
}
@end
这样我们知道了delegate是一个ClassB,它就可以提供ClassB里的方法。可以把一部分ClassC里的工作放在ClassB里去实现。这样的写法看起来是不是有点奇怪?或者应该写成这样?
@interface ClassC {
ClassB *classB;
}
@end
- (void)doSomething {
[self blahblah];
[self.delegate guruguru];//放到delegate中去执行这个guruguru函数
[self blahblah];
}
delegate是我们写的类,这个类如果可以被传给UITableView做为其delegate,那唯一要求,就是它实现了
- (void)guruguru;
这个方法。
@protocol XXXProtocol
- (void)guruguru;
@end