2010-12-16 1 views
0

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

Недавно я наблюдал за лекцией о контроллерах навигации и т. Д. В серии 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 
} 

ответ

0

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

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

+0

Возможно, я неправильно понял ваш комментарий, fbrerto. Таким образом, я нахожусь на правильном пути с моим psuedo-кодом для myListController в том, что «список» подталкивает «деталь» к стеку, а затем делегирует делегат детали «в список»? И я поставил свой @protocol SetDataInParent в неправильном месте? – Gregir 2010-12-16 21:35:30