Objective C术语:outlet&代表

时间:2010-01-15 00:33:15

标签: iphone objective-c delegates cocoa-design-patterns outlet

我在理解iPhone如何处理事件的出口概念方面遇到了问题。救命!代表们也让我感到困惑。有人愿意解释一下吗?

2 个答案:

答案 0 :(得分:19)

Outlets (在Interface Builder中)是类中的成员变量,其中设计器中的对象在运行时加载时被分配。 IBOutlet宏(它是一个空#define)表示Interface Builder将其识别为设计器中显示的插座。

例如,如果我拖出一个按钮,然后将其连接到aButton插座(在我的界面.h文件中定义),在运行时加载NIB文件将分配aButton指向由NIB实例化的UIButton的指针。

@interface MyViewController : UIViewController {
    UIButton *aButton;
}

@property(nonatomic, retain) IBOutlet UIButton *aButton;

@end

然后在实施中:

@implementation MyViewController

@synthesize aButton; // Generate -aButton and -setAButton: messages

-(void)viewDidAppear {
    [aButton setText:@"Do Not Push. No, seriously!"];
}

@end

这消除了编写代码以在运行时实例化和分配GUI对象的需要。


对于委托,它们是接收另一个对象使用的对象的事件(通常是一个通用的API类,如表视图)。关于他们没有任何内在的特殊之处。它更像是一种设计模式。委托类可以定义几个预期的消息,例如:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

...当API对象想要通知事件时,它会在委托上调用此消息。例如:

-(void)update:(double)time {
    if (completed) {
        [delegate process:self didComplete:totalTimeTaken];
    }
}

委托定义了消息:

-(void)process:(Process *)process didComplete:(double)totalTimeTaken {
    NSString *log = [NSString stringWithFormat:@"Process completed in %2.2f seconds.", totalTimeTaken];
    NSLog(log);
}

这种用法可能是:

Process *proc = [Process new];
[proc setDelegate:taskLogger];
[proc performTask:someTask];

// Output:
// "Process completed in 21.23 seconds."

答案 1 :(得分:9)

委托是另一个对象可以转发消息的对象。换句话说,就像你妈妈告诉你打扫你的房间,然后你把它当作你的小弟弟一样。你的小兄弟知道如何完成这项工作(因为你懒得学习),所以他为你做了。