有人可以解释一下代表在iphone sdk中的确切工作方式..... ??? 一个简单的例子如何使用委托以及使用委托有什么好处。
答案 0 :(得分:3)
Delegate pattern在iPhone SDK中广泛使用。考虑一下这些例子:
您正在运行动画。底层系统为您处理动画。但是,当动画结束时(例如,想要激活按钮或在动画结束时显示某些文本),您想要做某事是很自然的。现在,当动画结束时,动画系统将如何知道该怎么做?毕竟这是你的自定义任务。因此,您将为动画配置委托,系统将在动画结束时调用该委托方法。显然,您将在此委托方法中执行自定义任务。
您有一个文本字段,并且您想知道用户何时在该字段中点击或编辑了某些内容。你怎么知道的?您将为文本字段配置委托,并且在编辑或点击该特定字段时,UITextField类将调用预定义委托方法。
忘记UIApllicationDelegate?系统负责加载和运行应用程序。它如何告诉你它的初始化已经完成,你现在可以运行你的代码了吗?它将调用app delegate的applicationDidFinishLaunching方法。
您正在进行异步http请求。加载数据后,将调用您的委托方法,以便您现在可以处理数据。
还有更多的例子。为了使用委托,您需要指定委托对象,有时还需要指定选择器。究竟需要做什么取决于你在做什么。也就是说,配置动画委托与配置文本字段委托不同。但是一般过程是相同的,那就是你需要指定你的委托对象。
动画的示例代码:
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