Delegates and Data Sources

作者: ADreamClusive | 来源:发表于2021-04-11 15:16 被阅读0次

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

    委托模式的工作原理

    委托模式的机制

    委托类需要有一个叫做delegate的属性,同时,在Protocol中声明一些代理方法,代理实现其中需要的方法;

    委托消息的形式

    代理方法通常的形式为:

    • 带返回值的方法,如返回BOOL值,可能影响委托对象的执行逻辑;
    • 不带返回值的,用于委托对象通知代理对象事件的处理状态,以will/should或did/has开头表示即将或已经完成某个动作,这类方法也可以影响委托对象的行为。

    委托机制和Application Frameworks

    在Cocoa和Cocoa Touch程序中,委托对象通常是一个响应者对象,代理通常是自定义的对象。框架中包含很多委托对象:
    NSApplicationNSBrowserNSControlNSDrawerNSFontManagerNSFontPanelNSMatrixNSOutlineViewNSSplitViewNSTableViewNSTabViewNSTextNSTextFieldNSTextViewNSWindow

    数据源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

        本文链接:https://www.haomeiwen.com/subject/xrsokltx.html