Делегаты iPhone и создание 2-х установленных объектов разговаривают друг с другом - PullRequest
0 голосов
/ 05 августа 2011

У меня было около 6 часов, пытаясь отработать пользовательские приложения-делегаты. даже после обучения я получаю ошибки!

Мне нужен простой способ, позволяющий одному объекту разговаривать с другим.

У меня есть корневой вид. затем другое представление, которое затем помещается в стек со списком параметров. затем другой вид, показывающий соответствующие опции, основанные на предыдущем выборе.

Так что в основном 3 представления, и мне нужно представление 3, чтобы передать данные обратно представлению 1, когда я popBackToRootViewController .... Это становится огромной головной болью, потому что в теории это должно быть так просто. Ранее я только что выбросил данные в nsuserdefaults, но использую протоколы так, как Apple предлагает это сделать.

Пожалуйста, кто-нибудь может помочь мне понять:)

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Существуют разные способы решения этой проблемы.Прежде всего, вы могли бы снова и снова передавать первый просмотр представлению, в которое вносите изменения, а затем вызывать метод представления 1. Я не буду этого рекомендовать.Другой, гораздо более простой способ - использовать Уведомления .Просто зарегистрируйте свой первый просмотр в центре уведомлений [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(somethingChanged) name:@"aStringWichIsUniqeForCallingSomethingChanged" object:nil];.Вы должны предоставить и реализовать метод обратного вызова (что-то изменилось в моем случае).В вашем подвиде, где все происходит, вы должны опубликовать уведомление, выполнив [[NSNotificationCenter defaultCenter] postNotificationName:@"aStringWichIsUniqeForCallingSomethingChanged" object:nil];.И не забудьте удалить представление из центра уведомлений, если они больше не нужны! [[NSNotificationCenter defaultCenter] removeObserver:self]; Третья возможность - использовать сингелтон (например, делегат приложения), который содержит все виды, которые должны взаимодействовать.Просто создайте все представления как ivars и свойства для них в этом синглтоне и реализуйте в каждом из них методы, которые следует вызывать, если что-то меняется.Затем позвоните [[singelton sharedInstance] view1] somethingChanged].

Если я говорю View, я имею в виду viewController, но мне лень это писать.;) Надеюсь, это поможет!

0 голосов
/ 05 августа 2011

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

Однако в тех случаях, когда довольно небольшой, хорошо известный набор информации должен передаваться взад и вперед между двумя (или более) хорошо известными объектами, которые вряд ли будут использоваться повторно, неформальность вполне устраивает.

Это означает, что вы можете:

  • предоставить отправляющему объекту свойство типа получающего объекта
  • реализовать метод в приемном объекте, который будет принимать информацию, которая будет отправлена ​​в качестве аргумента
  • в некоторый момент, например, в вашем случае, когда корневой контроллер выдвигает дочерний элемент, который становится отправляющий объект, принимающий объект будет устанавливать себя в качестве значения отправляющего объекта
  • , если отправляющий объект имеетдля отправки информации используется ссылка на принимающий объект для отправки ему сообщения, вызывающего ранее упомянутый метод, передавая информацию в качестве аргумента

Как я упоминал ранеере, это имеет смысл для клея кода.Вы не должны делать это таким образом, если:

  • вы работаете в команде и работаете над одним объектом, а товарищ по команде работает над другим
  • очевидно, что вы сможете использовать те же функции в будущем проекте.В этом случае подумайте о наличии промежуточного подкласса между вашим исходным суперклассом и вашим подклассом для конкретного приложения, который инкапсулирует основные функциональные возможности и предлагает формальный протокол для взаимодействия с ним
  • обмен информацией включает объекты различныхклассы в одном и том же приложении
  • сам обмен информацией довольно сложен, и один (или два) метода склеивания его не охватят
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...