Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вызвать метод из UIView, Вызов метода у неизвестного класса. 
:(
    Опции темы
kindanew
Дата 4.3.2013, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



Добрый день!

Есть игра.
На экран выводится куча объектов 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?

Спасибо!


PM MAIL   Вверх
Bitter
Дата 4.3.2013, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Цитата(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, чтоб знать кого удалять.
PM MAIL ICQ Skype   Вверх
kindanew
Дата 4.3.2013, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



Bitter, Спасибо за ответ.
С делегатом мне показалось как-то не очень красиво. Смотрел в сторону центра уведомлений.
PM MAIL   Вверх
Bitter
Дата 4.3.2013, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



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

Добавлено через 1 минуту и 7 секунд
делегаты это отличный паттерн, к тому же он не вызывает путаницы в коде.
PM MAIL ICQ Skype   Вверх
kindanew
Дата 4.3.2013, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



Bitter, хорошо, спасибо!
Буду сегодня пробовать.
PM MAIL   Вверх
kindanew
Дата 5.3.2013, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



Чот не получается ;)
Добавлю ещё немного описания.

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 ?
PM MAIL   Вверх
Bitter
Дата 5.3.2013, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



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

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

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

ну вообще то на UIView игры писать не очень хорошо. Разве что крестики нолики. Потому что UIView не особо шустрый. Для это используйте движки типа Cocos2D и тд. И вот в таком случае старайтесь придерживаться архитектуры, в которой объект общается только с тем, кто его создал. В вашем случае Game должен создавать объекты игры, объекты должны общаться с Game.
PM MAIL ICQ Skype   Вверх
kindanew
Дата 5.3.2013, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



Bitter, Cocos2D пока не хочу использовать.

По моему вопросу: скорее всего вот этот UnitView : UIView должен отправлять сообщение в контроллер, который его родил, а контроллер в свою очередь вызывает метод модели с целью переместить объект куда надо.
PM MAIL   Вверх
Bitter
Дата 5.3.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



Вы хотели узнать как это обычно реализуется, я вам сказал как. Не хотите использовать то, что нужно использовать - зачем тогда спрашивали? )
По вопросу - зачем вы создаете объекты в контроллере, если они являются частью игры? А значит логически принадлежат к Game. Создавайте их там и управляйте ими там. У вас контроллер выполняет не свою задачу
PM MAIL ICQ Skype   Вверх
kindanew
Дата 5.3.2013, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



Bitter, Да, до Cocos2D я ещё не дорос ;)
Цитата

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

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

Спасибо!

Это сообщение отредактировал(а) kindanew - 5.3.2013, 14:43
PM MAIL   Вверх
Bitter
Дата 5.3.2013, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 10
Всего: 27



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

Надеюсь хоть что-то понятно из того, что я написал )
PM MAIL ICQ Skype   Вверх
kindanew
Дата 5.3.2013, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



Цитата

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

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

Чииррс!
PM MAIL   Вверх
kindanew
Дата 6.3.2013, 08:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 1.4.2010

Репутация: нет
Всего: нет



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

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | iOS | Следующая тема »


 




[ Время генерации скрипта: 0.0658 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.