Цель C, iOS, как мне присоединить пару переменных int к UIImageView, который является частью IBOutletCollection? - PullRequest
0 голосов
/ 18 мая 2011

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

@property (nonatomic, retain) IBOutlet IBOutletCollection(UIImageView) 
    NSArray *multipleFootballs;

Я считаю, что мне нужно создать суперкласс.Хотя я не уверен, что лучший способ сделать это?

EDIT3: Спасибо, ник, но как мне тогда получить доступ к свойству экземпляра?

@interface FootballImageView : UIImageView {
    int intCurrentGoal;
}
@property (readwrite) int intCurrentGoal;

@implementation FootballImageView
@synthesize intCurrentGoal;

-(id)init {

    self = [super init];
    if(self) {
        // do your initialization here...
    }
    return self; 
}

@end

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
for (id football in multipleFootballs) {

    //if ([[touches anyObject] intCurrentGoal] == 0) {
    //if (football.intCurrentGoal == 0) {

Ответы [ 2 ]

1 голос
/ 18 мая 2011

должно быть легко:

  • Создайте новый подкласс, наследующий от UIImageView, назовем его MyImageView
  • Добавьте необходимые переменные экземпляра в заголовок
  • Выберите в качестве класса для старых UIImageView новый MyImageView в конструкторе интерфейсов (вкладка Identity)
  • Изменить IBOutletCollection(UIImageView) на IBOutletCollection(MyImageView)

-

- (id)init 
{
    self = [super init];
    if(self) {
        // do your initialization here...
    }
    return self; 
}

Ответить для редактирования 3

Проблема, с которой вы сталкиваетесь, - это анонимный тип (id), который вы используете в touchesBegan. Поставьте чек следующим образом:

for (FootballImageView *football in multipleFootballs) {
    if(football.intCurrentGoal == 0) {
        football.intCurrentGoal++;
    } 
}
0 голосов
/ 18 мая 2011

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

  1. Смешивание состояний с представлениями сделает вещи излишне сложными.
  2. Cocoa Touch разработан с расчетом на то, что приложения примут парадигму MVC.

В качестве примера первого пункта рассмотрим, что происходит, когда пользователь переключается с основного игрового экрана, чтобы изменить настройки, ответить на телефонный звонок и т. Д. На мой взгляд, у вас есть три варианта: а) сохранить все даже если они не отображаются, вы можете поддерживать состояние приложения; б) сохранить состояние из представлений перед выпуском представлений; в) запретить пользователю переходить из игры. Ни (а), ни (в) не кажутся хорошими идеями, и если вы выберете подход MVC, вы получите (б) бесплатно.

Вместо этого создайте модель данных, которая может представлять все аспекты вашей игры. Вы можете использовать стандартные классы, такие как NSDictionary и NSSet, или классы вашего собственного дизайна, такие как Football и Pitch, или (наиболее вероятно) комбинацию. Затем создайте игровой контроллер, который наблюдает за изменениями соответствующих объектов модели и вносит изменения в соответствующие представления.

...