Что подразумевается под .delegate = self? - PullRequest
35 голосов
/ 18 ноября 2010

Может ли кто-нибудь объяснить значение someViewController.delegate = self и self.delegate?Где они нам помогают?

Ответы [ 3 ]

85 голосов
/ 18 ноября 2010

Делегаты отправляют вам сообщения .

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

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

Если вы используете всплывающие окна, они отправляют вам сообщения. И способ, которым это сделано, с делегатом PopUp. Есть много, много примеров.

Итак, делегаты отправляют сообщения.

Это так просто.

Вы можете спросить: «ГДЕ он отправляет эти сообщения?»

Ответ таков: он отправляет сообщения туда, где вы установили «.delegate».

Когда вы «устанавливаете делегата», вы говорите, куда вы хотите отправлять сообщения.

Следовательно,

blah.delegate = amazingPlace отправит сообщения "amazingPlace".

blah.delegate =whereElse будет отправлять сообщения в "whereElse ".

blah.delegate = self отправит вам сообщения ...... .

Очень часто вы хотите, чтобы сообщения приходили "вам", поэтому вы просто говорите "blah.delegate = self"

Очень распространенная ошибка - забывать эту строку кода.

Если вы забудете эту строку кода, вы забиты. Сообщения отправляются в никуда , и вы остаетесь чесать голову, пытаясь выяснить, что пошло не так.

Что-то еще, что вам нужно сделать: когда вы используете делегата, вы должны заранее объявить, что вы хотите использовать делегата.

Как это сделать?

В старые времена с целью-c, вы только что сделали это ...

@interface AppDelegate_Pad : NSObject <UIApplicationDelegate>
@interface BigTop : UIViewController <ASIHTTPRequestDelegate,
                                        UIPopoverControllerDelegate>
@interface Flying : UIViewController <UIAccelerometerDelegate>

Вы можете видеть, что BigTop хочет использовать двух делегатов, а именно ASIHTTPRequestDelegate и UIPopoverControllerDelegate. Принимая во внимание, что «Flying» хочет использовать только один делегат - он хочет использовать акселерометр.

В Swift это не может быть проще - у вас просто запятая, а не протоколы:

 class YourClass:UIViewController, SomeDelegate, AnotherDelegate

Вы действительно не можете сделать много на iPhone без использования делегатов повсюду.

Делегаты используются везде и всегда в iOS.

Совершенно нормально, что класс может использовать дюжину делегатов.

В приведенном выше примере с "Полетом" где-то в коде "Полета" должно быть сказано ...

[[UIAccelerometer sharedAccelerometer] setDelegate:self];

В случае BigTop, он должен был бы установить делегат где-то для ASIHttpRequests,

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:gid forKey:@"gid"];
[request setPostValue:nom forKey:@"nom"];
[request setDelegate:self];

(Не забывайте, что в старые времена с целью-c x.delegate=self было точно таким же, как [x setDelegate:self].)

В настоящее время с Swift вы просто набираете

  x.delegate = self

и это все, что нужно.

Так вот, что ты делаешь. Делегаты отправляют сообщения . Вы должны сказать , где вы хотите, чтобы сообщения отправлялись. Как правило, вы хотите, чтобы они обращались к «вам», поэтому в этом случае вы просто говорите x.delegate=self.

Надеюсь, это поможет.

0 голосов
/ 03 января 2018

Delegate используется для передачи / передачи данных / сообщений ч / б двух объектов классов.Здесь tableView (Отправитель) отправляет данные / сообщение на viewController (Получатель).Рассмотрим пример реализации UITableView в пользовательском viewController Здесь UITableViewDataSource & UITableViewDelegate на самом деле являются протоколами.К сожалению, UIKit Framework не является открытым исходным кодом.Но я заверю это в том, что происходит внутри, после ссылки на многие статьи.

Протокол похож на баскетбольного тренера с некоторыми требованиями.Он / она говорит игрокам как класс, структура, перечисление what to do?, используя эти требования.Но Он / Она doesn't knows how to do? сами по себе.Таким образом, класс или структура, которые соответствуют этому протоколу, должны обеспечивать реализацию этих требований, в то же время достигая того, чтобы выполнить мяч.

protocol UITableViewDelegate {
 func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
}

Протокол называется протоколом DataSource, тогда он всегда содержит требуемые функции с «типом возврата».", как показано ниже.

protocol UITableViewDataSource {
 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
 func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
}

Реализация UITableView внутри пользовательского viewController

class viewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    let tableView = UITableView()    

    override func viewDidLoad {
      tableView.delegate = self
      tableView.dataSource = self
    }

Здесь tableView действует как делегат (отправитель) и viewController object i.e (self) как делегат (получатель).

Чтобы получить UITableView в viewController. Он должен соответствовать обоим протоколам.

Итак, объект класса viewController реализовал все необходимые функции обоих протоколов.Теперь self можно использовать как тип UITableViewDelegate или тип UITableViewDataSource, поскольку Protocol можно использовать как тип для объекта класса, который ему соответствует.Теперь оба свойства tableView, т. Е. delegate и dataSource, присвоены self, поскольку он имеет одинаковые соответствующие типы протоколов.

Необязательные функции обоих протоколов реализованы в viewControllerОбъект класса, как показано ниже

Протокол UITableViewDelegate Функции

func tableView(_ tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
// Do further processes like pushing or poping another viewController
}

Протокол UITableViewDataSource Функции

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 10
 }

func tableView(_ tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    return UITableViewCell(style: UITableViewCellStyle.Value1, reuseIdentifier: "Cell")
 }

1) Когда пользователь выбирает строку в разделе, тоtableview (Отправитель), т.е. UItableView() вызывает функцию UITableViewDelegate, показанную ниже, путем передачи данных в параметры tableView & indexPath, которые находятся в объекте viewController (Получатель) через его свойство delegate.Теперь viewController использует эти переданные данные для выполнения дальнейших процессов, таких как отправка или вставка в новый пользовательский viewController.

tableView.delegate?.tableView(UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)

2) Функции внутри протокола UITableViewDatasource предоставляют пользовательские данные для tableview (Отправитель).tableview запрашивает объект viewController, вызывая функции источника данных с передачей данных параметрам tableView & indexPath, которые находятся в viewController объекте (получателе) через его свойство datasource.Теперь viewController использует эти переданные данные и возвращает пользовательские данные обратно tableview.Теперь tableview использует эти данные для создания "10" ячеек в секции и типа "ячейки" в indexpath

tableView.dataSource?.tableView(UITableView, numberOfRowsInSection section: Int) -> returns "10"

tableView.dataSource?.tableView(UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> returns "cell"

Наконец, целое UIKit Framework использует шаблоны проектирования делегатов и источников данных во всех своих классах, напримеркак UIApplication, UITableView, UICollectionView, UITextField и так далее для передачи данных.К сожалению, UIKit Framework не является открытым исходным кодом.

0 голосов
/ 18 ноября 2010

Если в любом случае ответ Борна не помогает ... делегат - это, по сути, реакция события на объект, и высказывание ".delegate = self" означает, что эти протоколы были приняты в себе ... например, .. что происходит, когда строка выбирается в табличном представлении, сообщается методом делегата табличного представления "didSelectRowAtIndexPath" ... и если viewcontroller имеет табличное представление .. и "didSelectRowAtIndexPath" определяется в этом viewcontroller только тогда, мы скажем ... tableview.delegate = self "... и «self.anything» используется, чтобы сказать, что «что-нибудь» является свойством self. например NSString * что-нибудь; @property (nonatomic, retain) NSString * что-нибудь;

затем "self.anything"

...