Delegates and Data Sources
2021-04-11 本文已影响0人
ADreamClusive
代理是一个对象,用于代替另一个对象对程序中的事件做出响应,或与另一个对象协作完成事件的响应;委托对象通常是响应者对象:NSResponder或 UIResponder的子类。
cocoa框架中的UITextField和UITableView都使用了委托机制,这种机制可以使代理对象根据变化协调UI和状态的改变;还可以在不使用继承的情况下改变另一个对象的行为。
委托模式的工作原理
![](https://img.haomeiwen.com/i8536890/a81b551bcf7865c0.jpg)
委托类需要有一个叫做delegate的属性,同时,在Protocol中声明一些代理方法,代理实现其中需要的方法;
委托消息的形式
代理方法通常的形式为:
- 带返回值的方法,如返回BOOL值,可能影响委托对象的执行逻辑;
- 不带返回值的,用于委托对象通知代理对象事件的处理状态,以will/should或did/has开头表示即将或已经完成某个动作,这类方法也可以影响委托对象的行为。
委托机制和Application Frameworks
在Cocoa和Cocoa Touch程序中,委托对象通常是一个响应者对象,代理通常是自定义的对象。框架中包含很多委托对象:
NSApplication、NSBrowser、NSControl、NSDrawer、NSFontManager、NSFontPanel、NSMatrix、NSOutlineView、NSSplitView、NSTableView、NSTabView、NSText、NSTextField、NSTextView、NSWindow
数据源Data Sources
数据源是数据代理,用于数据控制,而不是用于处理交互。一般由view持有,用于为view提供其所需要的数据;处理view中编辑的数据。数据源负责数据的持有,view仅在需要持有其当前展示需要的数据。
为自定义类实现代理
仅需以下几步:
- 声明delegate的访问方法
- (id)delegate;
- (void)setDelegate:(id)newDelegate;
- 实现访问方法,避免循环引用
- (id)delegate {
return delegate;
}
- (void)setDelegate:(id)newDelegate {
delegate = newDelegate;
}
- 声明协议方法
- 在调用委托方法时,需要确保代理实现了方法:respondsToSelector:
- (void)someMethod {
if ( [delegate respondsToSelector:@selector(operationShouldProceed)] ) {
if ( [delegate operationShouldProceed] ) {
// do something appropriate
}
}
}