Выходы (в Интерфейсном Разработчике) - это переменные-члены в классе, где объекты в конструкторе назначаются при загрузке во время выполнения. Макрос IBOutlet
(который является пустым #define
) сигнализирует Интерфейсному Разработчику, чтобы он распознал его как выход для отображения в конструкторе.
Например, если я вытаскиваю кнопку, а затем подключаю ее к выходу aButton
(определенному в моем файле .h интерфейса), загрузка файла NIB во время выполнения назначит aButton
указатель на этот UIButton
создается NIB.
@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."