Создание подкласса UIView и добавление свойства

Я пытался создать подкласс UIView. Потому что мне нужно перечисление в моем UIView, чтобы я мог проверить, нужно ли дважды нажимать UIView в моей игре. Но у меня не так много опыта с подклассами. И это не работает. Или мне нужно создать категорию?

Что я сделал:

  • Сделать подкласс UIView
  • Создать свойство внутри пользовательского подкласса
  • Измените класс с UIView на подкласс в раскадровке
  • Измените все объявления UIView из моего игрового класса на объявление подкласса

Код:

#import <UIKit/UIKit.h>

typedef NS_ENUM(NSInteger, viewStaat) {
    ENUMEnkelTap,
    ENUMDubbelTap
};

@interface BannerView : UIView

@property (nonatomic, assign) viewStaat staatVanDeView;

@end

И объявить свойство в инициализации из UIView.

@synthesize staatVanDeView;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        staatVanDeView = ENUMDubbelTap;
        NSLog(@"Set");
    }
    return self;
}

Журнал не вызывается, поэтому я не знаю, что не так. Целое число из staatVanDeView всегда остается равным 0.


person k3tzor    schedule 27.07.2014    source источник
comment
Nonatomic просто прекрасен, поскольку целое число является примитивным типом; вам не нужно назначение. Если вы синтезируете свойство в своем файле метода, вы можете получить/установить свойство где угодно.   -  person Luke    schedule 27.07.2014
comment
Я отредактировал это. Очевидно, я не могу установить свойство, и журнал не вызывается.   -  person k3tzor    schedule 27.07.2014
comment
Вы загружаете свой вид из пера или создаете его в коде?   -  person Vladislav Kovalyov    schedule 27.07.2014
comment
Поскольку это свойство синтезируется вручную, вам нужно вызвать self.staatVanDeView = ENUMDubbelTap   -  person Luke    schedule 27.07.2014
comment
@VladislavKovalyov Мои представления установлены в раскадровке, и я изменил класс с UIViews на свой подкласс UIView.   -  person k3tzor    schedule 27.07.2014
comment
@ Люк Это не работает. По-прежнему остается 0 для моего целого числа, поскольку оно должно быть 1 из моего перечисления.   -  person k3tzor    schedule 27.07.2014


Ответы (1)


Метод -initWithFrame: не будет вызываться при создании экземпляра представления из раскадровки. Вместо этого используйте -initWithCoder::

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self) {
         staatVanDeView = ENUMDubbelTap;
    }
    return self;
} 

И вам не понадобится линия

@synthesize staatVanDeView;

потому что геттеры и сеттеры для свойств создаются автоматически в последних версиях iOS.

person Mischa    schedule 27.07.2014
comment
Спасибо, чувак, это работает! Могу ли я удалить initWithFrameиз моего подкласса? - person k3tzor; 27.07.2014
comment
да. Когда вы всегда создаете экземпляр своего представления из раскадровки, вы можете удалить метод -initWithFrame. - person Mischa; 27.07.2014