8

У меня возникли проблемы с пониманием концепции торговых точек, как iPhone занимается событиями. Помогите! Делегаты меня тоже путают. Кто-нибудь захочет объяснить, пожалуйста?Объективная терминология C: торговые точки и делегаты

+2

Не пытайтесь быть рывком, но вы читали вступительные документы на developer.apple.com? Просто, что вопрос должен был бы дать эссе, чтобы ответить. Возможно, задайте более подробный вопрос о том, что вас подвешивает. –

+0

Документация, которую 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 кажется довольно тщательный для меня. –

+0

@Brad - Я не являюсь документирующим человеком. – Moshe

ответ

19

Розетки (в 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." 
+0

Итак, делегаты на самом деле являются прославленными версиями того, что другие языки, такие как Javascript или Python, интерпретируют как обратные вызовы, правильно? – SexyBeast

9

Делегат является объект, другой объект может пересылать сообщения. Другими словами, это похоже на то, когда твоя мама говорила, что ты убираешь свою комнату, и ты заложил ее на своего младшего брата. Ваш маленький брат знает, как делать работу (поскольку вы слишком ленивы, чтобы учиться), и поэтому он делает это за вас.

+1

Какое замечательное, дидактическое сравнение! –

+1

Почему мама не попросила маленького брата напрямую? – super9

 Смежные вопросы

  • Нет связанных вопросов^_^