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

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

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

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

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

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

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

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

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

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

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

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

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

 @interface AppController : NSObject { //... } 

затем реализовать его в реализации

 @implementation AppController - (NSInteger*)getTaskCount { return [model queryTaskCount]; } - (XXTask*)getTaskForRow:(NSInteger*)rowNumber { return [[model tasks] getItem:(NSInteger*)rowNumber]; } 

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

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

 MyTableViewController : UITableViewController  

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

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

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

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

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

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

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

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

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

  • Получить процентное использование процессора
  • Ошибка Apple Mach-O Linker при компиляции для устройства
  • Переменные экземпляра для объектов Objective C
  • Как проверить локальный Wi-Fi (не только сотовую связь) с помощью iPhone SDK?
  • Рисование поэтапно в UIView (iPhone)
  • Округлые углы на UIImage
  • Как я могу «разрезать» прозрачное отверстие в UIImage?
  • Круглое двойное значение до 2 знаков после запятой
  • iPhone - Что такое reuseIdentifiers (UITableViewCell)?
  • Пользовательский пузырь выноски MKPinAnnotation похож на пузырь по умолчанию
  • Как написать простой метод Ping в Cocoa / Objective-C
  • Interesting Posts

    Можно ли использовать кабель HDMI для передачи файлов между ноутбуками?

    Открытие веб-браузера не в новом браузере

    Проблема веб-фильтра моего провайдера Telecom

    Удаленный рабочий стол для нескольких оконных компьютеров в локальной сети с динамическим IP-адресом

    Как я могу анализировать проблемы производительности до / во время процесса входа в систему?

    Как остановить stream asynctask в android?

    Найдите самый старший бит (самый левый), который установлен в бит-массиве

    Как преобразовать существующий 64-разрядный Win7 в виртуальную машину?

    Одномерный доступ к многомерному массиву: хорошо ли оно определено?

    Visual Studio: как показать все classы, унаследованные от базового classа?

    Разрешен размер массива во время выполнения без динамического распределения?

    Невозможно решить метод setLatestEventInfo

    Что такое элемент DOM?

    Программа для подключения видео TS с использованием командной строки

    Ошибка Gmail. Для SMTP-сервера требуется защищенное соединение или клиент не прошел аутентификацию. Ответ сервера: 5.5.1 Требуется аутентификация

    Давайте будем гением компьютера.