Как использовать делегат для передачи данных назад / вверх по цепочке контроллеров в Obj-C / Cocoa - PullRequest
0 голосов
/ 16 декабря 2010

Я знаю, что есть много информации о делегатах в документации Apple dev, а также в других моих книгах, а также в таких ресурсах, как stackoverflow и другие.Но я все еще не понимаю.

Недавно я смотрел лекцию о контроллерах Navigation View и т. Д. В серии Stanford CS193P Winter 2010, и в этой лекции они рассказывают о передаче данных на стек контроллеров представления, что очень просто.Но они вкратце упомянули, что в идеале вы должны использовать делегат / протокол для передачи данных «назад» (например, от контроллера детального просмотра к контроллеру списка), но они не делали демонстрационный или пост-пример кода.

Я прочитал и искал образец этого точного сценария, чтобы я мог обернуться вокруг этого использования делегата / протокола, но не могу найти его.Вот какой-то псевдокод, с которым я играю.Должен ли он достичь передачи данных «назад»?

myListController : UIViewController <SetDataInParent> {
 // when pushing detail controller onto stack,
 // set DetailController delegate = self
}

myDetailController : UIViewController {
//header file
@protocol SetDataInParent <NSObject>
- (void)willSetValue:(*NSString);
@end

@interface myDetailController {
id <SetDataInParent> delegate;
}
@end

// class/m file 
@implementation
@synthesize delegate;
- (void)willSetValue:(*NSString) {
// code here that would take argument
// from detail controller and set
// a value or text field to that
// argument in list controller
}
// send message to list controller class
- [delegate willSetValue:string];
@end
}

1 Ответ

0 голосов
/ 16 декабря 2010

Делегатом является просто любой другой экземпляр Objective-C, отличный от того, которым вы в настоящее время являетесь, и которому вы будете отправлять одно или несколько сообщений. Указанный вами тип (id <SetDataInParent) гласит, что это любой тип Objective-C, который соответствует протоколу SetDataInParent (который я не вижу определенным в вашем коде, но вы могли бы использовать его в другом месте.)

При переходе "назад", как правило, ссылка делегата между двумя объектами создается во время создания дочернего представления. Следовательно, в тот момент, когда контроллер представления списка создает контроллер подробного просмотра, первый должен установить делегата в последнем self. Затем контроллер подробного представления может использовать этот указатель делегата для отправки сообщений в контроллер представления списка, либо напрямую, например, через willSetValue:, либо косвенно (через performSelector:withObject:.). При использовании performSelector:withObject: обычно рекомендуется вызывать respondsToSelector: на делегате первым, чтобы убедиться, что вы не выбросите исключение, если объект не отвечает на это сообщение.

...