2012-04-27 4 views
4

Я работал над тем, чтобы переместить одно из моих приложений из процесса «shared appdelegate», который, как представляется, был нахмурился, несмотря на его чрезмерное использование. Я пытаюсь настроить методы протокола для того, что хочу, но у меня нет нулевой удачи. мой вопрос в том, можете ли вы даже сказать, что один диспетчер представлений посылает запросы делегатов нескольким классам? от того, что я обнаружил, это не похоже на то, что вы можете. что не имеет смысла, потому что я думал, что это была цель делегатов и протоколов с mvc. теперь просто для того, чтобы уточнить, я знаю, что у вас может быть один элемент управления представлением в качестве делегата для нескольких других контроллеров viewcontrollers. но это не то, что я прошу. для простого примера, скажем, у вас есть шаблон флип-утилиты для яблок. кнопка «done» просто вызывает метод делегата mainvc, чтобы отклонить его. теперь позволяет сказать, что мы добавили новый класс под названием ...Несколько делегатов в объекте-c

@interface NewClass : NSObject <TheOtherDelegate> 

и был метод делегата ...

- (void)doSomething 
{ 
NSLog(@"The Delegate did something..."); 
} 

мы можем иметь кнопку на flipsideviewcontroller, что мы хотели бы назвать это делегировать метод, но по-прежнему держать кнопку «done» на методе делегата в mainviewcontroller, который отклоняет его?

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

NewClass *myDelegate = [NewClass alloc] init] 
[fillInMethodHere setDelegate:myDelegate]; 

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

на боковой ноте, поскольку я работал в своем рабочем проекте, я прочитал предложение об удалении #import и добавлении @class. снова, что сломало все виды вещей. странное дело, прежде чем делать это, что я до сих пор работал и строил хорошо. когда я удалил новый @class и прокомментировал #import. xcode внезапно дал мне ошибку «не может найти замедление протокола для ...», но все же он работал несколько секунд назад. мне нужно будет удалить код протокола и снова добавить его, чтобы он снова работал. очень большой.

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

+0

Вы уверены, что импортировали обоих делегатов, используя эту функцию < >? Стэнфорд сделал демоверсию, которая работала с 2 делегатами. Я могу связать вас с ним – TheNavigat

+0

У вас не может быть нескольких делегатов, потому что делегаты принимают решения для делегирования. Что делать, если несколько делегатов должны были не согласиться? Я думаю, что вы понимаете делегата как своего рода наблюдателя, который просто информирован о вещах, но это неправильно. Шаблон Observer, реализованный в Cocoa с использованием 'NSNotificationCenter' и друзей, отличается. –

+0

Я уверен, что вы можете получить несколько делегатов. Вы говорите, что у вас есть несколько делегатов того же типа. Это полностью отличается от того, что у нескольких делегатов есть общее – TheNavigat

ответ

12

«Делегат» - не какой-то причудливый объект. Это просто синтезированное свойство идентификатора типа delegate. Если бы вы захотели, у вас могло бы быть произвольное количество свойств, все из которых соответствовали одному протоколу. Затем, когда вы хотите выдать обратный вызов, вы бы просто решить все из них:

[self.mydelegateA doSomething]; 
[self.mydelegateB doSomething]; 

т.д.

Вы также можете иметь NSMutableArray свойство, которое вы могли бы добавить объекты, а затем использовать [self.myMutableArrayOfDelegates makeObjectsPerformSelector:@selector(doSomething)].

Наконец, всегда существует маршрут NSNotificationCenter (не путать с push-уведомлениями) - это класс, который обеспечивает межобъектную систему обмена сообщениями. Многие объекты могут регистрироваться для сообщения, которое может отправить любой другой объект.

Дополнительную информацию см. В документации Apple.Click Here.

Независимо от того, что это OS X документации, она по-прежнему очень хорошо объяснить вещи визуально: click here.

Вот пример простого изменения имени свойства делегата: click here

И вот пример добавления другого протокола и второго делегата: click here

Наконец, вот пример, который основывается на предыдущих двух и имеет третьего делегата, который также соответствует одному и тому же протоколу: click here

+1

Как @JackLawrence говорит, просто назовите их по-разному. Подумайте об этом, как UITableView. У него действительно есть два делегата. Один называется «делегат», а один называется «dataSource». Им просто нужно было называть это чем-то другим, потому что у вас не может быть двух переменных, называемых делегатами (и даже если бы вы могли, вы не могли бы организовать ваши вызовы делегатов очень хорошо!). – lnafziger

+0

@inafziger точно! Я собирался вставить этот маленький лакомый кусочек о 'UITableView', но полностью забыл. –

+0

@jack проблема в вашем [self.delegateA doSomething] и т. Д. не работает. если вы внимательно прочитаете мой вопрос, вы увидите, что я это сделал, и он не работает. вы даже не можете взять рабочего делегата и изменить все объявления свойств и sythesize от «делегата» до «adelegate».если вы не верите мне, создайте новое приложение «утилита» и измените « delegate» в .h & "@synthesize delegate = _delegate" в .m на что-то еще и посмотрите, что произойдет. оповещение о спойлере, приложение выйдет из строя. снова, консервированные протоколы делегатов Apple могут работать нормально, но пользовательские они не выглядят. – DoS

Смежные вопросы