之前一直困惑delegate的设计模式,自己闲的时候写了个demo,加了点注释,希望初学者可以看看,不妥之处请大家指出。
这里只粘贴出关键代码:
一、 自定义协议:
// xyzDelegate.h
#import <Foundation/Foundation.h>
@protocol xyzDelegate <NSObject>
-(void)showName:(NSString *)name;
@end
//
二、通用写法都写为delegate并给它加nonatomic,assign防止魔鬼引用
B.h
#import <UIKit/UIKit.h>
#import "xyzDelegate.h"
@interface ViewControllerB :UIViewController
{
id<xyzDelegate>delegate;
}
@property(nonatomic,assign)id<xyzDelegate>delegate;
@end
-(void)transvalue{
//上个页面跳过来的时候设置了指针委托,那么这里就会识别到delegate响应了这个方法;
if ([delegate respondsToSelector:@selector(showName:)])
{
UITextField *mytext = (UITextField *)[self.viewviewWithTag:1001];
//step01
[delegateshowName:mytext.text];
[self.navigationControllerpopToRootViewControllerAnimated:YES];
}
}
//调到下个页面,此时设置下个页的delegate方法给ViewController本身,这个协议及自定义的协议,协议的是由B来配置的,那么B里面可以检测到其是否将自己的delegate委托给某人,这里是委托给ViewController,让它来完成本来应该让B自己来做的事情,现在由A代劳;
-(void)jp2next
{
ViewControllerB *bvc = [[ViewControllerBalloc] init];
//设置委托
bvc.delegate =self;
[self.navigationControllerpushViewController:bvc animated:YES];
[bvc release];
}
//delegate's method
//step02
//这样viewController和viewcontrollerB就产生了通信
//这里的name及由viewControllerb中传过来的
-(void)showName:(NSString *)name
{
NSLog(@"将b的delegate指定给a,让a来实现");
lbe.text = [NSStringstringWithFormat:@"%@",name];
NSLog(@"%@",name);
}