OC之代理协议的新概念
网摘)
OBJC 中的 protocol 相当于 java 里的接口,delagate 就是接口的实现类(C中的回调类似 );
数据源就是对象遵循了存储数据的协议,可以存储使用数据
协议表示了方法可以被任何类所实现。协议本身不是类。他们只是简单定义了一个其他对象可以实现的接口。当你的类实现了协议中的某个方法的时候也就是说你的类实现了那个协议。
Objective-C的另一个扩展称为协议,它非常象Java中的接口。两者都是通过一个简单的方法声明列表发布一个接口,任何类都可以选择实现。协议中的方法通过其它类实例发送的消息来进行调用。
iPhone程序开发里,object-c里的delegate怎么理解?
答:设置代理
然后就可以实现协议了。
相当于C++里实现一个接口,或Java里实现一个抽象类里的抽象方法。
有些类里不仅可以设置代理,还可以为其设置数据源(比如一些模态窗口UIActionSheet之类的)。
有很多时候是需要在B类口中来完成一些对A类的操作, 这时就需要A设个代理让B来完成了,这个在应用中很常见也很实用。
来源地址http://www.cocoachina.com/bbs/read.php?tid-26591.html
iphone开发重要基础知识------委托代理(degegate)
委托代理(degegate),顾名思义,把某个对象要做的事情委托给别的对象去做。那么别的对象就是这个对象的代理,代替它来打理要做的事。反映到程序中,
首先要明确一个对象的委托方是哪个对象,委托所做的内容是什么。委托机制在很多语言中都用到的,这只是个通用的思想,网上会有很多关于这方面的介绍。
那么在苹果开发过程中,用到委托的程序实现思想如下,我主要拿如何在视图之间传输信息做个例子。譬如:在两个页面(UIIview视
图对象)实现传值,用委托(delegate)可以很好做到。
方法:
@interface
A:UIView
id
transparendValueDelegate;
@property(nomatic, retain) id
transparendValueDelegate;
@end
@implemtion
A
@synthesize
transparendValueDelegate
-(void)Function
{
NSString*
value = @"hello";
[transparendValueDelegate transparendValue:
value];
}
@end
类B
@interface
B:UIView
NSString*
value;
@end
@implemtion
B
-(void)transparendValue:(NSString*)fromValue
{
value
= fromValue;
NSLog(@"the value is %@
",value);
}
@end
//
下面的设置A代理委托对象为B
//在定义A和B类对象处:
A* a = [[A alloc]
init];
B* b = [[B alloc] init];
a.
transparendValueDelegate = b;//设置A代理委托对象为B
这样
在视图A和B之间可以通过委托来传值了。
下面这个例子委托有两类:
1、一个视图类对象的代理对象为父视图,子视图用代理实
现让父视图显示别的子视图
2、同一父视图下的一个子视图为另一个子视图的代理对象,让另一个子视图改变自身背景色为给定的颜色
代理,解决了C++中,动不动就要继承等等,实现个协议就ok了。
比如mfc中,每一个程序都要继承自CWinApp无非就是要重写那几个虚函数,不觉得麻烦嘛?
所以啊,在cocoa里面,就实现个UIApplicationDelegate代理,不用继承。只需要关心
你要捕获的应用程序生命周期中的事件(函数)就可。
代理就是一个引用指针,比方类a中有一个类b得指针,则b就是a得代理,a得代理就是b,那么a干完一件事情得时候告诉b,让b调用对应得方法来做响应。。这就是代理
协议(Protocol)的用法和代码例子
协议,是通过网络,计算机使用者进行通讯后,互相进行约定规定的集合。两个类进行通讯,用协议就比较方便。下面是 CocoaChina 版主“angellixf”为新手写的协议入门介绍以及代码例子,希望对刚入门开发者有所帮助
一、说明
1.协议声明了可以被任何类实现的方法
2.协议不是类,它是定义了一个其他对象可以实现的接口
3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
5:委托,就是调用自己定义方法,别的类来实现。
6.新特性说明
@optional预编译指令:表示可以选择实现的方法
@required预编译指令:表示必须强制实现的方法
二、定义
.h
@protocol
ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end
@interface
ContactsCtrl : UIViewController {
id
<ContactCtrlDelegate> delegate;
}
@property (nonatomic, assign) id
<ContactCtrlDelegate> delegate;
.m
@synthesize
delegate;
三、例子
例如:UITextView
@protocol
UITextViewDelegate <NSObject>
@optional
-
(BOOL)textViewShouldBeginEditing:(UITextView *)textView;
-
(BOOL)textViewShouldEndEditing:(UITextView *)textView;
-
(void)textViewDidBeginEditing:(UITextView *)textView;
-
(void)textViewDidEndEditing:(UITextView *)textView;
-
(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text;
-
(void)textViewDidChange:(UITextView *)textView;
-
(void)textViewDidChangeSelection:(UITextView
*)textView;
@end
如果要调用以上这些方法,就必须设置UITextView的委托:TextView.delegate =
self;
四、Demo
1、ContactsCtrl.h
#import
<UIKit/UIKit.h>
//定义协议
@protocol
ContactCtrlDelegate
-(void)DismissContactsCtrl;
@end
@interface
ContactsCtrl : UIViewController {
IBOutlet
UINavigationBar *ContactNavBar;
id
<ContactCtrlDelegate> delegate;
}
@property (nonatomic,
assign) id <ContactCtrlDelegate>
delegate;
-(IBAction)canCelBtn:(id)sender;
@end
2、ContactsCtrl.m
@implementation
ContactsCtrl
@synthesize delegate;
// Implement
viewDidLoad to do additional setup after loading the view, typically from a
nib.
- (void)viewDidLoad {
[super
viewDidLoad];
ContactNavBar.topItem.prompt =
@"选取联系人发送短信";
}
//调用协议中的方法
-(IBAction)canCelBtn:(id)sender{
[delegate
DismissContactsCtrl];
}
3、ProtocolDemoCtrl.h
#import
<UIKit/UIKit.h>
#import "ContactsCtrl.h"
@interface
ProtocolDemoCtrl : UIViewController
<ContactCtrlDelegate>{//添加委托
ContactsCtrl
*contactsView;
}
4、ProtocolDemoCtrl.m
#import
"ProtocolDemoCtrl.h"
#define BARBUTTONADD(SELECTOR) [[[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self
action:SELECTOR] autorelease];
@implementation
ProtocolDemoCtrl
@synthesize contactsView;
// Implement viewDidLoad to
do additional setup after loading the view, typically from a nib.
-
(void)viewDidLoad {
[super
viewDidLoad];
self.navigationItem.rightBarButtonItem
= BARBUTTONADD(@selector(addContactAction:));
}
-
(void)addContactAction:(id)sender{
ContactsCtrl
*contactView = [[ContactsCtrl alloc] initWithNibName:@"ContactsCtrl"
bundle:nil];
self.contactsView =
contactView;
contactsView.delegate =
self;//设置委托
[self
presentModalViewController:contactsView
animated:YES];
[contactView
release];
}
//实现ContactCtrlDelegate协议中的方法
-(void)DismissContactsCtrl{
[contactsView
dismissModalViewControllerAnimated:YES];
}
具体看下Demo的实现哈,还有有时间可以看看Objective-c基础教程2.0这本书。(新手注意)
采用某个协议 相当于给阅读类声明的编程人员发送一条消息,表明我们啊可以用他完成两件事情,啥呢
1、对自身编码和解码
2、能够复制自身
如果你没定义
那你第四步的func就是自己的方法 而不是协议中的了
而且协议又没说你必须实现方法了 你也知道协议分为正式协议和非正式协议,正式的采用实现方法