【问题标题】:How to use custom delegates in Objective-C如何在 Objective-C 中使用自定义委托
【发布时间】:2010-10-13 07:49:58
【问题描述】:

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

【问题讨论】:

  • 嗨 Syam,只是为了澄清一下您是来自 .NET 并询问如何在 Objective-C 中实现委托(面向对象的函数调用)?或者您是在问如何实现 Objective-C 辅助类(也称为委托)?

标签: objective-c cocoa-touch delegates


【解决方案1】:

您需要为您的类声明一个委托协议。 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 &lt;FooDelegate&gt; {}。因为这个类符合FooDelegate 协议,所以它现在可以实现FooDelegate 下的方法(要实现这些方法,请使用@required 而不是@optional)。最后一步是在符合FooDelegate 的类中实例化一个Foo 对象,并为这个Foo 对象设置其委托属性:

Foo *obj = [[Foo alloc] init];
[obj setDelegate:self];

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

【讨论】:

  • 使用 id delegate 和 NSObject *delegate 有什么区别?
  • 不同之处在于后者期望delegateNSObject 或其子类的实例。前者只需要某种 Objective-C 对象(它可能是一个代理,或者,上帝保佑,其他一些根对象)。
  • 谢谢!我只是认为@protocol FooDelegate 意味着委托是 NSObject 的子类。
  • @Filipe 啊,是的,这有点令人困惑。事实上,@protocol Blah &lt;NSObject&gt; 括号中的位表示 protocol &lt;Blah&gt; 继承自 protocol &lt;NSObject&gt;。要得到的一个关键点是有一个类NSObject以及一个协议&lt;NSObject&gt;
  • 这很有道理,谢谢乔纳森!虽然我注意到如果我使用 id 而不是 NSObject(对于委托类型),我不能使用对委托有用的 performSelectorOnMainThread。
【解决方案2】:

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

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

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

SampleDelegate.h

#import
@protocol SampleDelegate
@optional

#pragma Home Delegate

-(NSString *)getViewName;

@end
  1. 将上面的协议类导入您要委托给另一个类的类中。在我的前任这里。我正在使用 AppDelegate 来委托 HomeViewController 的对象。

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

}

【讨论】:

    【解决方案3】:

    如果有问题的对象将其delegate 分配给您编写的类,例如controller,则定义为该对象类的delegate 方法的方法必须由分配的类实现。这使您可以有效地控制对象的行为,而无需对对象的类进行子分类以覆盖可能需要大量重复行为的行为。它是可可触控设计中更清洁的部分之一。

    这是您应该在前几篇关于可可触摸的介绍和教程中了解的内容。喜欢这个tutorial from Cocoa is my Girlfriend。事实上,他们将delegate 的解释设为了一个大胆的大标题。

    【讨论】:

      【解决方案4】:

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

      Communicating With Objects

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

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

      希望能帮助您入门。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        • 2017-09-08
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 2012-09-14
        相关资源
        最近更新 更多