关于cocoa touch:如何在Objective-C中使用自定义委托

How to use custom delegates in Objective-C

我需要知道Objective-C中委托方法的用法。有人能给我指出正确的来源吗?


您将要为类声明委托协议。一个代表类EDCOX1(4)的委托协议和接口的例子可能是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@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下的方法(为了要求实现这些方法,使用@required而不是@optional)。最后一步是在符合FooDelegate的类中实例化Foo对象,并为此Foo对象设置其委托属性:

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

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


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

下面是自己的代表的一个小例子……

  • 创建协议类…(仅H)
  • 采样elegate.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #import
    @protocol SampleDelegate
    @optional

    #pragma Home Delegate

    -(NSString *)getViewName;

    @end
  • 在要将其委托给其他类的类中导入上面的协议类。在我的示例中,我正在使用AppDelegate使HomeViewController的对象成为委托。
  • 同时在委托引用中添加上面的DelegateName<>

    owndelegateappdelegate.h(W.ndelegateappdelegate.h)

    1
    2
    3
    4
    5
    6
    7
    #import"SampleDelegate.h"

    @interface ownDelegateAppDelegate : NSObject <UIApplicationDelegate, SampleDelegate>
    {


    }

    owndelegateappdelegate.m

    1
    2
    3
    4
    5
    6
    7
    8
    //setDelegate of the HomeViewController's object as
    [homeViewControllerObject setDelegate:self];

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

    家庭视图控制器.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #import
    #import"SampleDelegate.h"

    @interface HomeViewController : UIViewController
    {

        id<SampleDelegate>delegate;
    }

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

    @end

    家庭视图控制器.h

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    - (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方法定义的方法必须由分配的类实现。这允许您有效地控制对象的行为,而无需对对象的类进行子类化,以便重写可能需要大量重复行为的行为。它是可可触摸设计中最清洁的部分之一。

    这是你应该在第一对内幕和教程接触可可接触。像可可这个教程是我的女朋友。事实上,他们把EDCX1 0解释为一个大胆的标题。


    首先,你可以看看苹果对委托方法的看法。文档提供了一些关于委托的书面信息,并解释了如何使用定义和支持委托的AppKit类,以及如何将委托支持编码为自己的对象之一。

    请参见与对象通信

    (如果您有兴趣对自己的委托支持进行编码,请跳到"为自定义类实现委托"部分。)

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

    希望这能帮助你开始。