在iphone sdk中使用Delegate

时间:2010-08-03 12:39:58

标签: iphone delegates

有人可以解释一下代表在iphone sdk中的确切工作方式..... ??? 一个简单的例子如何使用委托以及使用委托有什么好处。

4 个答案:

答案 0 :(得分:3)

Delegate pattern在iPhone SDK中广泛使用。考虑一下这些例子:

  1. 您正在运行动画。底层系统为您处理动画。但是,当动画结束时(例如,想要激活按钮或在动画结束时显示某些文本),您想要做某事是很自然的。现在,当动画结束时,动画系统将如何知道该怎么做?毕竟这是你的自定义任务。因此,您将为动画配置委托,系统将在动画结束时调用该委托方法。显然,您将在此委托方法中执行自定义任务。

  2. 您有一个文本字段,并且您想知道用户何时在该字段中点击或编辑了某些内容。你怎么知道的?您将为文本字段配置委托,并且在编辑或点击该特定字段时,UITextField类将调用预定义委托方法。

  3. 忘记UIApllicationDelegate?系统负责加载和运行应用程序。它如何告诉你它的初始化已经完成,你现在可以运行你的代码了吗?它将调用app delegate的applicationDidFinishLaunching方法。

  4. 您正在进行异步http请求。加载数据后,将调用您的委托方法,以便您现在可以处理数据。

  5. 还有更多的例子。为了使用委托,您需要指定委托对象,有时还需要指定选择器。究竟需要做什么取决于你在做什么。也就是说,配置动画委托与配置文本字段委托不同。但是一般过程是相同的,那就是你需要指定你的委托对象。

    动画的示例代码:

    CATransition *animation = [CATransition animation];
    [animation setDelegate:delegate];  // here delegate is your delegate object
    

    动画结束后,您的代理对象的

    - (void)animationDidStop:(CAAnimation *)theAnimation finished:(BOOL)flag
    将被调用,您将在此方法中进行自定义。

答案 1 :(得分:1)

代理是一种解耦消息发送者和接收者的方法。而不是消息发布者必须#import可能对消息感兴趣的所有类的定义,而是发布者定义委托类型,并在该委托上调用方法以发送消息。接收器类然后实现委托。

答案 2 :(得分:1)

Wikipedia有解释和示例:)

  

在软件工程中,委托模式是一种设计模式   在面向对象编程中   一个对象,而不是执行一个   其所述任务,代表们   任务到关联的辅助对象。   可以说,它可以降低成本   (技术上,反转   责任)。辅助对象是   叫代表。代表团   模式是其中一个基础   作为基础的抽象模式   其他软件模式如   成分(也称为   聚合),mixins和方面。

答案 3 :(得分:0)

基本定义: 委托是一个对象,当该对象遇到程序中的事件时,该对象代表另一个对象或与另一个对象协调。 more details

场景(用于消息传递): 假设对象A调用对象B来执行操作。一旦操作完成,对象A应该知道B已完成任务并采取必要的操作。这就是代表团的工作方式。

借助协议,我们可以在iOS中实现委派。这里是 代码:

ViewControllerA.h

#import <UIKit/UIKit.h>

@interface ViewControllerA : UIViewController
{

}
@end

ViewControllerA.m

#import "ViewControllerA.h"
#import "ViewControllerB.h"

@interface ViewControllerA ()<SimpleProtocol>

@end

@implementation ViewControllerA

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [self performSelector:@selector(delegatingWorkToControllerB)withObject:nil afterDelay:3.0];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


-(void)delegatingWorkToControllerB{
    ViewControllerB *vcB = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerB"];
    vcB.delegate = self;
    [self presentViewController:vcB animated:YES completion:^{

    }];
}


#pragma mark - SimpleProtocol Delegate Method

-(void)updateStatus:(NSString*)status {
    NSLog(@"%@",status);
}

@end

ViewControllerB.h

#import <UIKit/UIKit.h>

@protocol SimpleProtocol<NSObject>

-(void)updateStatus:(NSString*)status;

@end

@interface ViewControllerB : UIViewController
{

}
@property(nonatomic, unsafe_unretained)id<SimpleProtocol>delegate;

@end

ViewControllerB.m

#import "ViewControllerB.h"

@interface ViewControllerB ()

@end

@implementation ViewControllerB

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    [self performSelector:@selector(informingControllerAAfterCompletingWork) withObject:nil afterDelay:3.0];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
 }

-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
}


-(void)informingControllerAAfterCompletingWork{
    //you can perform some task here and after completion of the task you can call this to notify the previous controller

    [self.delegate updateStatus:@"controller B work has done.. update successfull :)"];

    //dismissing the view controller
    [self dismissViewControllerAnimated:YES completion:^{

    }];
}

@end

工作示例:code