如何在Objective-C中使用自定义委托

Sre*_*lal 51 cocoa-touch delegates objective-c

我需要了解Objective-C中委托方法的用法.谁能指出我正确的来源?

Jon*_*ing 128

您需要为您的类声明委托协议.类的委托协议和接口的示例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
Run Code Online (Sandbox Code Playgroud)

别忘了合成你的房产@implementation.

这段代码的作用是声明一个名为FooDelegate的协议; 符合此协议的类将被声明为@interface SomeClass : SuperClass <FooDelegate> {}.因为这个类符合协议FooDelegate,所以它现在可以实现下面的方法FooDelegate(要求实现这些方法,@required而不是使用它们@optional).最后一步是Foo在符合的类中对象进行实例化FooDelegate,并为此Foo对象设置其delegate属性:

Foo *obj = [[Foo alloc] init];
[obj setDelegate:self];
Run Code Online (Sandbox Code Playgroud)

现在,您的类已准备好接收来自Foo正确设置其委托的对象的消息.

  • @Filipe啊,是的,这有点令人困惑.实际上,`@protocol Blah <NSObject>`的括号内部表示*protocol*`<Blah>`继承自*protocol*`<NSObject>`.要获得的一个关键点是有一个类'NSObject`以及一个协议`<NSObject>`. (4认同)

iCr*_*Dev 8

代理对于手动控制应用程序中视图控制器数组内的传输非常有用.使用代理,您可以很好地管理控制流程.

这是自己代表的一个小例子....

  1. 创建协议类....(仅限.h)

SampleDelegate.h

#import
@protocol SampleDelegate
@optional

#pragma Home Delegate

-(NSString *)getViewName;

@end
Run Code Online (Sandbox Code Playgroud)
  1. 在要为其他类委托的类中导入上面的协议类.在我的前任.我使用AppDelegate来创建HomeViewController的Object的委托.

还在Delegate Reference <>中添加了DelegateName

ownDelegateAppDelegate.h

#import "SampleDelegate.h"

@interface ownDelegateAppDelegate : NSObject <UIApplicationDelegate, SampleDelegate>
{


}
Run Code Online (Sandbox Code Playgroud)

ownDelegateAppDelegate.m

//setDelegate of the HomeViewController's object as
[homeViewControllerObject setDelegate:self];

//add this delegate method definition
-(NSString *)getViewName
{
    return @"Delegate Called";
}
Run Code Online (Sandbox Code Playgroud)

HomeViewController.h

#import
#import "SampleDelegate.h"

@interface HomeViewController : UIViewController 
{

    id<SampleDelegate>delegate;
}

@property(readwrite , assign) id<SampleDelegate>delegate;

@end
Run Code Online (Sandbox Code Playgroud)

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];

}
Run Code Online (Sandbox Code Playgroud)


Sea*_*phy 2

首先,您可以看看 Apple 关于委托方法的说法。该文档提供了一些关于委托的详细信息,并解释了如何使用定义和支持委托的 AppKit 类以及如何将委托支持编码到您自己的对象之一中。

请参阅与对象通信

(如果您有兴趣编写自己的委托支持,请跳至“为自定义类实现委托”部分。)

委托方法最重要的一点是,它们使您能够自定义和影响对象的行为,而无需对其进行子类化。

希望能帮助您入门。