Что именно делает делегат в проекте xcode ios? - PullRequest
28 голосов
/ 27 августа 2011

Я только что изучил разработку приложений для iPhone, но мне трудно понять, что на самом деле означает делегат?Кто-нибудь может рассказать мне на примере, что он делает и насколько это важно?Спасибо за любую помощь!

Ответы [ 3 ]

41 голосов
/ 27 августа 2011

Это ключевая концепция для концептуального понимания, поэтому важно подумать над тем, как думать об этом, прежде чем приступить к техническим деталям. Проще говоря, делегат является обратным вызовом.

Два основных сценария использования делегатов:

  1. Класс или элемент управления хотят абстрагироваться от деталей о том, как выполнять работу (например, извлекать данные).
  2. Разрешить другим подключать код к конвейеру.

Примеры: UITableView - табличное представление - это просто элемент управления, который знает, как отобразить список ячеек. Он обрабатывает все тяжелые операции рендеринга, прокрутки и т. Д. Но он не знает, как загрузить ваши данные. Таким образом, вы реализуете делегат источника данных, который имеет методы для получения данных ячейки для данной строки и т. Д. Это облегчает вам задачу. Вы просто используете элемент управления и вставляете данные для своих данных. UITableView сделает все за вас ... просто ответьте на несколько конкретных вопросов. Делегат отвечает на эти несколько конкретных вопросов.

Текстовый элемент управления - вы добавляете текстовый элемент управления для вашего представления и вуаля! Вы можете ввести его и все хорошо. Но что, если вы захотите что-то сделать, когда они начнут печатать или когда они закончат печатать? Ну, текстовый элемент управления предлагает делегат с методами, которые позволяют вам подключиться к конвейеру выполнения текстового элемента управления. Он позволяет текстовому управлению делать все за вас и позволяет вставлять код там, где он вам нужен. Много раз, есть способ вставить код, чтобы принять решение о том, разрешено ли что-то. Управление перезвонит и спросит, могу ли я сделать х? Вы можете вставлять код и влиять на поведение.

Если вы создаете элемент управления или класс, вы можете создать свой собственный протокол, делегатов источника данных и т. Д. ... так что ваш элемент управления может сосредоточиться на том, что рекламируется. Например, допустим, вы хотите создать элемент управления задачами. Вы могли бы:

Сначала создайте договор. Эй, если вы собираетесь предоставить данные для моего контроля, вот вопросы, которые я собираюсь вам задать. Я возьму это оттуда ... В этом случае я собираюсь спросить вас о количестве заданий, и я собираюсь попросить вас дать мне задание, учитывая номер строки.

@protocol XXTaskBoardDelegate <NSObject>
-(NSInteger*)getTaskCount;
-(XXTask*)getTaskForRow:(NSInteger*)rowNumber;
@end

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

@implementation XXTaskBoard
- (void)setDelegate:(id<XXTaskBoardDelegate>)newDelegate
{
    // the control stores the delegate so it can callback and ask you questions.
}

Затем для класса делегата в заголовке объявите, что вы реализуете этот формальный протокол. и в файле реализации m вы предоставляете код.

@interface AppController : NSObject<XXTaskBoardDelegate> 
{
    //...
}

затем внедрите его в реализацию

@implementation AppController
- (NSInteger*)getTaskCount
{
    return [model queryTaskCount];
}

- (XXTask*)getTaskForRow:(NSInteger*)rowNumber
{
    return [[model tasks] getItem:(NSInteger*)rowNumber];
}
10 голосов
/ 27 августа 2011

Делегат - это объект, которому другой класс может передавать сообщения.На практике классы делегатов должны соответствовать протоколу делегатов.

Например, мы возьмем подкласс контроллера таблицы.Это представитель вашей таблицы.Сначала вы определяете, что это делегат табличного представления, выполняя это:

MyTableViewController : UITableViewController <UITableViewDelegate>

Это говорит о том, что класс MyTableViewController является подклассом UITableViewController и СООТВЕТСТВУЕТ протоколу UITableViewDelegate.

Установка [tableView setDelegate:self] (или определение его как такового в IB) затем передает объект self в табличное представление для того, чтобы табличное представление могло отправлять ему сообщения.

Основное сообщение, которое он отправляет, является didSelectRowAtIndexPath сообщение, которое сообщает вашему классу, что пользователь нажал на ячейку табличного представления.

Таким образом, объект, который принимает событие click (табличное представление), передает сообщение о том, что ячейка была нажата для объекта делегата.(в данном случае это ваш MyTableViewController объект).

Существуют протоколы делегатов, так что вы можете убедиться, что у объекта делегата есть необходимые методы для обработки ваших сообщений.Методы в протоколе делегата могут быть @optional или принудительными.Любые необязательные методы не должны быть определены.В вашем MyTableViewController классе метод didSelectRowAtIndexPath является необязательным - вам не нужно его иметь.Если табличное представление не находит метод, оно просто не вызовет его.

Однако cellForRowAtIndexPath необходим, и без него ваше приложение не будет компилироваться.

Я надеюсь, что этопомогает и прост для вас.Если вам нужна дополнительная информация, дайте мне знать.

3 голосов
/ 27 августа 2011

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

Например, когда происходят события, например, когда ваше приложение помещается в фоновый режим или приложение собирается завершить работу, объект UIApplication вызовет делегат приложения, чтобы сообщить об этом. Когда CLLocationManager имеет новую позицию GPS, он вызовет вашего делегата, чтобы передать ему новую позицию. UITableView вызывают своих делегатов, чтобы получить UITableViewCells для отображения в таблице. Существует много вариантов использования делегатов в iOS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...