Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > iOS > Как вызвать метод из UIView


Автор: kindanew 4.3.2013, 13:59
Добрый день!

Есть игра.
На экран выводится куча объектов UnitView класса UIView.
UnitView имеет в свойствах модель класса Unit.
В классе UnitView при инициализации добавляется UIGestureRecognizer.

Есть класс Game, в котором логика. Во ViewController-е импортируется Game.h и UnitView.h.

Суть вопроса.
При SwipeDown на UnitView нужно выполнить метод класса Game, который удаляет из массива array тот самый Unit.

Думается мне, что Import "Game.h" в UnitView не очень хорошее решение? Прав ли я?

Правильно ли добавлять UIGestureRecognizer в Init'е класса UnitView : UIView ?

Как быть, если нужно выполнить метод удаления из массива в touchesEnded, а не только по swipeDown?

Спасибо!


Автор: Bitter 4.3.2013, 14:33
Цитата(kindanew @  4.3.2013,  13:59 Найти цитируемый пост)
Думается мне, что Import "Game.h" в UnitView не очень хорошее решение? Прав ли я?

Да не очень хорошее. Вам в этом случае нужно написать протокол в классе UnitView. и объявить делегата поддреживающего этот протокол. Когда делаете свайп, то вызываете метод протокола у делегата. Делегатом назначите ваш Game в момент создания UnitView.


Цитата(kindanew @  4.3.2013,  13:59 Найти цитируемый пост)
Правильно ли добавлять UIGestureRecognizer в Init'е класса UnitView : UIView ?

Очень даже правильно


Цитата(kindanew @  4.3.2013,  13:59 Найти цитируемый пост)
Как быть, если нужно выполнить метод удаления из массива в touchesEnded, а не только по swipeDown?

если метод touchesEnded вызывается у UnitView, то просто вызывайте тот же метод делегата. Да и не забудьте в метод передать ссылку на UnitView, чтоб знать кого удалять.

Автор: kindanew 4.3.2013, 14:50
Bitter, Спасибо за ответ.
С делегатом мне показалось как-то не очень красиво. Смотрел в сторону центра уведомлений.

Автор: Bitter 4.3.2013, 15:11
kindanew, не советую, вы только хуже сделаете. Во-первых это вас приведет к утечкам, так как вы точно где-нибудь забудете удалить подписку, а во-вторых это запутывает программу превращая ее в индус-код

Добавлено через 1 минуту и 7 секунд
делегаты это отличный паттерн, к тому же он не вызывает путаницы в коде.

Автор: kindanew 4.3.2013, 15:24
Bitter, хорошо, спасибо!
Буду сегодня пробовать.

Автор: kindanew 5.3.2013, 09:30
Чот не получается ;)
Добавлю ещё немного описания.

UnitView создается в контроллере GameViewController.
Game создается при нажатии на кнопку тоже в GameViewController.
Game и GameViewController общаются через delegate.
UnitView и Game никак не связаны, но нужно выполнить метод в Game.

Создал протокол.
Импортировал его в UnitView и в Game 
В UnitView добавил свойство 
Код

@property (nonatomic, weak) id <UnitViewProtocol> delegate


Последовательность создания объектов такая:
В Game создается игра и посылается сообщение в контроллер (надо нарисовать юнитов)
Код

[self.delegate mustCreateUnits:self];


а вот в этом mustCreateUnits создаются вот эти UnitView : UIView.
грубо говоря
Код

UnitView *unit = [unit new];
unit.delegate = game; [I]//это вот обязательно должно быть, как я понимаю?[/I]


т.е. теперь, вроде как, UnitView может общаться с Game, но этого не происходит.

Может быть стоит добавить ещё один класс, в котором будет массив живых юнитов и убитых?

Меня код особо не интересует, код я напишу, меня интересует, как обычно такое реализуется?
Каким-то образов нужно реагировать на нажатие на юнитов и передавать это всё в логику.

Может быть GameViewController должен вызывать метод в Game?
Т.е. UnitView говорит в GameViewController - меня убили , GameViewController посылает сообщение в логику Game ?

Автор: Bitter 5.3.2013, 10:46
Цитата(kindanew @  5.3.2013,  09:30 Найти цитируемый пост)
unit.delegate = game;

Да это вы правильно написали. Теперь вы из юнита можете вызывать методы делегата, которые нужно реализовать в game. Почему могут не общаться: делегат = nil, метод в делегате не описан, метод который вызывает методы делегата не вызвался.

Цитата(kindanew @  5.3.2013,  09:30 Найти цитируемый пост)
как обычно такое реализуется?

ну вообще то на UIView игры писать не очень хорошо. Разве что крестики нолики. Потому что UIView не особо шустрый. Для это используйте движки типа Cocos2D и тд. И вот в таком случае старайтесь придерживаться архитектуры, в которой объект общается только с тем, кто его создал. В вашем случае Game должен создавать объекты игры, объекты должны общаться с Game.

Автор: kindanew 5.3.2013, 14:02
Bitter, Cocos2D пока не хочу использовать.

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

Автор: Bitter 5.3.2013, 14:29
Вы хотели узнать как это обычно реализуется, я вам сказал как. Не хотите использовать то, что нужно использовать - зачем тогда спрашивали? )
По вопросу - зачем вы создаете объекты в контроллере, если они являются частью игры? А значит логически принадлежат к Game. Создавайте их там и управляйте ими там. У вас контроллер выполняет не свою задачу

Автор: kindanew 5.3.2013, 14:42
Bitter, Да, до Cocos2D я ещё не дорос ;)
Цитата

По вопросу - зачем вы создаете объекты в контроллере, если они являются частью игры? А значит логически принадлежат к Game. Создавайте их там и управляйте ими там. У вас контроллер выполняет не свою задачу

Вот!
Мне показалось, что так принято делать, так сказать, БЭСТ_ПРАКТИКА. Т.е. контроллер создает визуальные объекты.
Попробую перенести создание UIView в модель Game.

Спасибо!

Автор: Bitter 5.3.2013, 14:52
Когда что-то моделируете, то старайтесь руководствоваться принципом "должно быть так, как в жизни" ) (сам только что придумал название)
Например если у вас есть объект "машина", то у него есть объект "ходовая", а у ходовой есть массив объектов "колесо". Но если вы сделаете объект Машина у которого массив {ходовая, руль, колесо, колесо, ...} то это не правильно. В жизни ведь не так. 
Или например у вас есть оружие которое стреляет пулей. Так вот пуля в жизни (ну во всяком случае упрощенно) сама управляет своим поведением в полете. То есть если вы сделаете выстрел и полетом пули будет управлять объект "оружие", то это не правильная архитектура. Однако объект пули создает именно оружие, а не персонаж или кто-то другой.

Надеюсь хоть что-то понятно из того, что я написал )

Автор: kindanew 5.3.2013, 15:39
Цитата

Надеюсь хоть что-то понятно из того, что я написал ) 

Да , спасибо!
Буду осознавать. Завтра постараюсь рассказать о результатах.

Чииррс!

Автор: kindanew 6.3.2013, 08:37
Не было связи контроллера с Game.
Т.е. при создании Game нужно было контроллеру дать ссылку на этот класс, но такой строки не было.
Получается я сам ошибся.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)