iPhone SDK中的委托定义

时间:2011-08-24 07:46:20

标签: iphone objective-c oop ios4

任何人都可以通过实时场景解释iphone sdk中的DELEGATE定义。

抱歉我的问题很糟糕。

提前致谢。

4 个答案:

答案 0 :(得分:3)

委托是一个对象,它将在未来的某个时刻响应预先选择的选择器(函数调用)。

假设我使用类FancyAsynchronousURLGetter的对象异步(在后台)加载URL。由于它在后台运行,我希望能够在加载URL时去做其他事情,然后在准备就绪时收到通知。通过在FancyAsynchronousURLGetter上使用委托并编写适当的代码,我可以指定一个具有特定选择器的对象,当FancyAsynchronousURLGetter完成时将调用该对象。像这样:

- (void)loadView
{
    ...
    FancyAsynchronousURLGetter* getter = [[FancyAsynchronousURLGetter alloc] initWithURL:url];
    [getter setDelegate:self]; 
    /* 
    getter will call either 
        - (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g
    or 
        - (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g 
    on its delegate, depending on whether load succeeded or failed 
    */
    [getter start];
    ...
}

- (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g
{
    NSLog(@"Load succeeded.");
}


- (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g
{
    NSLog(@"Load failed.");
}

和FancyAsynchronousURLGetter本身:

- (void)start
{
    [self performSelectorInBackground:@selector(fetchURL) withObject:nil];
}

- (void))fetchURL
{
    Fetch the URL synchronously
    if ( success )
        [delegate fancyAsynchronousURLGetterLoadSucceeded:self]; // note: probably want to call this on the main thread
    else
        [delegate fancyAsynchronousURLGetterLoadFailed:self];
}

答案 1 :(得分:2)

以下是要了解的示例代码。

协议定义

    #import <Foundation/Foundation.h>

    @protocol ProcessDataDelegate <NSObject>
    @required
    - (void) processSuccessful: (BOOL)success;
    @end

    @interface ClassWithProtocol : NSObject 
    {
        id <ProcessDataDelegate> delegate;
    }

    @property (retain) id delegate;

    -(void)startSomeProcess;

    @end

协议实施

    #import "ClassWithProtocol.h"

    @implementation ClassWithProtocol 
    @synthesize delegate;

    - (void)processComplete
    {
        [[self delegate] processSuccessful:YES];
    }

    -(void)startSomeProcess
    {
        [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector: @selector(processComplete) userInfo:nil repeats:YES];
    }

@end

要充分了解,visit here...

答案 2 :(得分:0)

简短:委托是两个对象之间的一对一关系,允许一个人在另一个对象上调用方法,它让被调用者自定义实现该方法。

Delegation允许您编写自定义实现方法的自定义实现。

例如UITableView's Delegatedatasource(技术上与委托相同)允许UITableView让其他类重要的任务(如创建单元格)显示在tableview中并响应事件(例如,点击) tableview中的一个单元格。

要首先使用委托,您需要定义协议:

@protocol protocolNameHere 

- (void) sampleMethodHere;

@optional

- (void) implementingThisMethodIsOptional;

@end

然后你必须在“&lt;&gt;”中添加协议的名称在您想要委派的类的头文件的前面。该类现在符合该协议。你需要在这个类中实现该方法。

如果有多个代理人,则用逗号分隔,例如

答案 3 :(得分:0)

委托不依赖于您使用的语言或平台,它是一种设计模式。我建议你阅读Delegation pattern以获得基本的理解。在那之后,我认为你可以寻求进一步的理解。