2013-05-18 5 views
0

Хорошо - не совсем понятно, что здесь происходит. Я строю простую карточную игру. Я создал категорию UIView, которая обрабатывает все, что должно быть «Картой». Я считаю, что это не имеет значения, но, возможно, это не так.Настройка свойств объектов в NSMutableArray

В любом случае, на мой взгляд, контроллер, я просто создаю 2 NSMutableArrays, чтобы держать дилеров и игроков. Затем я вызываю метод для установки значения карты. В этом методе я делаю NSLog, чтобы увидеть значение конкретного объекта карты - и все выглядит хорошо. Но если я попытаюсь получить это значение от моего контроллера представления, он всегда возвращается для ВСЕХ объектов со значением последнего объекта в массиве.

некоторый код:

playersCards = [[NSMutableArray alloc] initWithObjects:[[UIView alloc] init],[[UIView alloc] init],nil]; 

[[playersCards objectAtIndex:0] setCardValue]; 
[[playersCards objectAtIndex:1] setCardValue]; 

NSLog(@"1: %i",[[playersCards objectAtIndex:0] returnValue]); 
NSLog(@"2: %i",[[playersCards objectAtIndex:1] returnValue]); 

Так что, когда я получаю NSLog после вызова setCardValue (это находится в пределах категории) - опять же, все в порядке. Но эти NSLogs прямо там - они возвращают значение индекса 1 для обоих. Что тут происходит?

+0

«Я создал категорию UIView ...» Что такое категория? «Я просто создаю 2 NSMutableArrays ...» playersCards - это одно. Что еще? Вещи просто не складываются. –

+0

Как я его лучше понимаю - Категории существенно расширяют существующие классы. В этом случае я создаю его, чтобы хранить все данные, которые «Карточка» должна иметь - ценность и костюм, - а также иметь способы «разбить» ее на игру, перевернуть ее и т. Д. Другой массив в этом приложение такое же, как у упомянутого выше массива playersCards, только для дилера. Я не включил его в код выше, так как он в принципе должен действовать одинаково; просто держите другой набор карт. – tnd

ответ

4

Невозможно, чтобы метод setCardValue знал, в каком индексе находится карта, если вы не делаете что-то запутанное. Поэтому вполне вероятно, что у вас есть две карты, но они идентично инициализированы.

Однако проблема здесь больше. Вы действительно не хотите использовать экземпляры UIView в качестве таких данных. Вы действительно хотите отделить биты, которые отображают материал на экране [View], из бит, которые удерживают состояние игры [model]. Как правило, существует слой между тем, который управляет состоянием модели на основе взаимодействия пользователя с представлением [controller].

Дополнительную информацию см. В документации по телефону Model-View-Controller.


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

Вы действительно хотите сохранить эти данные [состояние игры] изолированными от того, как данные нарисованы на экране [просмотров].

С точки зрения вашего конкретного вопроса в свой комментарий, другой вопрос:

Представьте, что ваш код был написан так:

Card *c = [cardArray objectAtIndex: 0]; 
[c doSomething]; 

Как бы c знать, что индекс это на в этом коде? Теперь обратите внимание, что указанный код идентичен [[cardArray objectAtIndex:0] doSomething];.

Если я проектировал какое-то игры карты, я бы, вероятно, создать несколько классов:

  • в Card классе, который просто хранит масть и значение. Поддержка NSCoding для архивных целей.

  • a CardView подкласс UIView который, учитывая костюм и ценность, знает, как визуализировать карту.

  • GameFieldView и GameFieldController набора классов, которые знают, как сделать игровое поле (бывший, UIView подкласс) и как двигаться CardViews о лопая (последний, UIViewController)

  • конкретных подклассы GameFieldController, добавляющих логику для вещей, таких как руки, стопки, свая и/или все, что вам может понадобиться для создания карточной игры.

.... и т.д ....

То есть, я бы разбить игру на ряд классов, которые соответствуют в прошивку или OS X просмотреть модель шаблоны контроллера таким образом, что I Я пишу минимальное количество кода и позволяя системе делать тяжелый подъем, который он предназначен.

Это может показаться излишним, что со всеми этими классами и всеми, но на самом деле отдельные классы относительно просты и достаточно гибкие.

+0

Спасибо за ваш ответ. Я все еще довольно новичок в Obj-C, поэтому я все еще пытаюсь найти лучший способ подойти к этим маленьким проектам. Я полагал, что создание категории с UIView было хорошим подходом, так как я могу обрабатывать визуальные аспекты каждой карты, которая в любом случае должна быть представлена ​​как UIView (правильно? Или нет?) И содержать все данные (стоимость, костюм, анимация, и т. д.) в категории, которая работала красиво, пока я не столкнулся с этим. Если я ссылаюсь на объект по определенному индексу, почему бы ему не узнать, какой индекс установить значение? Спасибо за вашу помощь. :) – tnd

+0

Полностью получить то, что вы сейчас говорите, bbum. Мне нужно немного пересмотреть мой дизайн. Спасибо за вашу помощь! Ура! – tnd

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