我在理解iPhone如何处理事件的出口概念方面遇到了问题。救命!代表们也让我感到困惑。有人愿意解释一下吗?
答案 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)
委托是另一个对象可以转发消息的对象。换句话说,就像你妈妈告诉你打扫你的房间,然后你把它当作你的小弟弟一样。你的小兄弟知道如何完成这项工作(因为你懒得学习),所以他为你做了。