Delegates and Data Sources

代理是一个对象,用于代替另一个对象对程序中的事件做出响应,或与另一个对象协作完成事件的响应;委托对象通常是响应者对象:NSResponder或 UIResponder的子类。
cocoa框架中的UITextField和UITableView都使用了委托机制,这种机制可以使代理对象根据变化协调UI和状态的改变;还可以在不使用继承的情况下改变另一个对象的行为。

委托模式的工作原理

委托模式的机制

委托类需要有一个叫做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
        }
    }
}

你可能感兴趣的:(Delegates and Data Sources)