【发布时间】:2010-10-13 07:49:58
【问题描述】:
我需要了解 Objective-C 中委托方法的用法。谁能指出正确的来源?
【问题讨论】:
-
嗨 Syam,只是为了澄清一下您是来自 .NET 并询问如何在 Objective-C 中实现委托(面向对象的函数调用)?或者您是在问如何实现 Objective-C 辅助类(也称为委托)?
标签: objective-c cocoa-touch delegates
我需要了解 Objective-C 中委托方法的用法。谁能指出正确的来源?
【问题讨论】:
标签: objective-c cocoa-touch delegates
您需要为您的类声明一个委托协议。 Foo 类的委托协议和接口示例可能如下所示:
@class Foo;
@protocol FooDelegate <NSObject>
@optional
- (BOOL)foo:(Foo *)foo willDoSomethingAnimated:(BOOL)flag;
- (void)foo:(Foo *)foo didDoSomethingAnimated:(BOOL)flag;
@end
@interface Foo : NSObject {
NSString *bar;
id <FooDelegate> delegate;
}
@property (nonatomic, retain) NSString *bar;
@property (nonatomic, assign) id <FooDelegate> delegate;
- (void)someAction;
@end
不要忘记在@implementation 中合成您的属性。
这段代码所做的是声明一个名为 FooDelegate 的协议;符合此协议的类将被声明为@interface SomeClass : SuperClass <FooDelegate> {}。因为这个类符合FooDelegate 协议,所以它现在可以实现FooDelegate 下的方法(要实现这些方法,请使用@required 而不是@optional)。最后一步是在符合FooDelegate 的类中实例化一个Foo 对象,并为这个Foo 对象设置其委托属性:
Foo *obj = [[Foo alloc] init];
[obj setDelegate:self];
现在,您的类已准备好接收来自Foo 对象的消息,这些对象的委托设置正确。
【讨论】:
delegate 是NSObject 或其子类的实例。前者只需要某种 Objective-C 对象(它可能是一个代理,或者,上帝保佑,其他一些根对象)。
@protocol Blah <NSObject> 括号中的位表示 protocol <Blah> 继承自 protocol <NSObject>。要得到的一个关键点是有一个类NSObject以及一个协议<NSObject>。
委托对于手动控制应用程序中视图控制器数组内的传输非常有用。使用委托可以很好地管理控制流。
这是自己的代表的小例子......
SampleDelegate.h
#import
@protocol SampleDelegate
@optional
#pragma Home Delegate
-(NSString *)getViewName;
@end
也在Delegate Reference中添加上面的DelegateName
ownDelegateAppDelegate.h
#import "SampleDelegate.h"
@interface ownDelegateAppDelegate : NSObject <UIApplicationDelegate, SampleDelegate>
{
}
ownDelegateAppDelegate.m
//setDelegate of the HomeViewController's object as
[homeViewControllerObject setDelegate:self];
//add this delegate method definition
-(NSString *)getViewName
{
return @"Delegate Called";
}
HomeViewController.h
#import
#import "SampleDelegate.h"
@interface HomeViewController : UIViewController
{
id<SampleDelegate>delegate;
}
@property(readwrite , assign) id<SampleDelegate>delegate;
@end
HomeViewController.h
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
UILabel *lblTitle = [[UILabel alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
lblTitle.text = [delegate getViewName];
lblTitle.textAlignment = UITextAlignmentCenter;
[self.view addSubview:lblTitle];
}
【讨论】:
如果有问题的对象将其delegate 分配给您编写的类,例如controller,则定义为该对象类的delegate 方法的方法必须由分配的类实现。这使您可以有效地控制对象的行为,而无需对对象的类进行子分类以覆盖可能需要大量重复行为的行为。它是可可触控设计中更清洁的部分之一。
这是您应该在前几篇关于可可触摸的介绍和教程中了解的内容。喜欢这个tutorial from Cocoa is my Girlfriend。事实上,他们将delegate 的解释设为了一个大胆的大标题。
【讨论】:
首先,您可以看看 Apple 对委托方法的看法。该文档提供了一些关于委托的全部内容的书面信息,并解释了如何使用定义和支持委托的 AppKit 类以及如何将委托支持编码到您自己的对象之一中。
(如果您对编写自己的委托支持感兴趣,请跳至“为自定义类实现委托”部分。)
委托方法最重要的一点是,它们使您能够自定义和影响对象的行为,而无需对其进行子类化。
希望能帮助您入门。
【讨论】: