Цель С терминология: торговые точки и делегаты - PullRequest
8 голосов
/ 15 января 2010

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

Ответы [ 2 ]

19 голосов
/ 15 января 2010

Выходы (в Интерфейсном Разработчике) - это переменные-члены в классе, где объекты в конструкторе назначаются при загрузке во время выполнения. Макрос 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."
9 голосов
/ 15 января 2010

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

...