Подтвердить что ты не робот

Что именно делает делегат в проекте xcode ios?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

В элементе управления или классе дайте потребителю способ предоставить нам класс источника данных делегата, который будет отвечать на вопросы, которые задает элемент управления. На данный момент контроль является чистым контролем. Он ничего не знает о том, как вы получаете свои данные. Он запрашивает объект (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];
}

Ответ 2

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

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

MyTableViewController : UITableViewController <UITableViewDelegate>

Это говорит о том, что класс MyTableViewController является подклассом UITableViewController и CONFORMS для протокола UITableViewDelegate.

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

Основное отправленное им сообщение - это сообщение didSelectRowAtIndexPath, которое сообщает вашему классу, что пользователь нажал клавишу просмотра таблицы.

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

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

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

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

Ответ 3

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

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