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

Что подразумевается под именем .delegate = self?

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

4b9b3361

Ответ 1

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

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

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

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

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

Это просто.

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

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

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

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

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

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

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

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

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

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

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

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

Вы можете видеть, что "BigTop" хочет использовать двух делегатов, а именно ASIHTTPRequestDelegate и UIPopoverControllerDelegate. В то время как "Летающий" хочет использовать только одного делегата - он хочет использовать акселерометр.

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

 class YourClass:UIViewController, SomeDelegate, AnotherDelegate

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

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

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

В приведенном выше примере "Flying", где-то в коде для "Flying", он должен был сказать [[UIAccelerometer sharedAccelerometer] setDelegate:self];

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

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

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

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

  x.delegate = self

и что все, что с ним связано.

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

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

Ответ 2

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

затем "self.anything"