У меня возникли проблемы с пониманием концепции торговых точек, как iPhone занимается событиями. Помогите! Делегаты меня тоже путают. Кто-нибудь захочет объяснить, пожалуйста?Объективная терминология C: торговые точки и делегаты
ответ
Розетки (в Interface Builder) являются переменными-членами в классе, где объекты в конструкторе назначаются, когда они загружаются во время выполнения. Макрос IBOutlet
(который пуст #define
) сигнализирует интерфейс Builder, чтобы распознать его как выход, который будет отображаться в дизайнере.
Например, если я влачить кнопку, а затем подключить его к розетке aButton
(определенной в моем интерфейсе .h файл), загрузка файла СИБ во время выполнения задаст aButton
указателя на этот 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."
Итак, делегаты на самом деле являются прославленными версиями того, что другие языки, такие как Javascript или Python, интерпретируют как обратные вызовы, правильно? – SexyBeast
Делегат является объект, другой объект может пересылать сообщения. Другими словами, это похоже на то, когда твоя мама говорила, что ты убираешь свою комнату, и ты заложил ее на своего младшего брата. Ваш маленький брат знает, как делать работу (поскольку вы слишком ленивы, чтобы учиться), и поэтому он делает это за вас.
Какое замечательное, дидактическое сравнение! –
Почему мама не попросила маленького брата напрямую? – super9
Не пытайтесь быть рывком, но вы читали вступительные документы на developer.apple.com? Просто, что вопрос должен был бы дать эссе, чтобы ответить. Возможно, задайте более подробный вопрос о том, что вас подвешивает. –
Документация, которую Apple предоставляет в Руководстве по основам какао на торговых точках: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/ TP40002974-CH7-SW3 и делегаты: http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18 кажется довольно тщательный для меня. –
@Brad - Я не являюсь документирующим человеком. – Moshe