Создание CGRect как связанного объекта?

Я пытаюсь создать свойство CGRect для моих UIButton в качестве связанного объекта, чтобы мне не приходилось создавать подкласс UIButton только для этого.

По сути, я добавляю свойство под названием tapArea, и у меня возникают проблемы с его созданием. Это то, что у меня есть до сих пор:

@dynamic tapArea;

- (void)setTapArea:(CGRect)tapArea {
    objc_setAssociatedObject(self, @selector(tapArea), [NSValue valueWithCGRect:tapArea], OBJC_ASSOCIATION_ASSIGN);
}

- (CGRect)tapArea {
    return [objc_getAssociatedObject(self, @selector(tapArea)) CGRectValue];
}

Когда я NSLog говорю dogButton.tapArea, регистратор выводит {{0,0},{0,0}}, что имеет смысл. Проблема возникает, когда я пытаюсь установить его. Я получаю следующий сбой:

-[__NSCFString CGRectValue]: unrecognized selector sent to instance 0x14e65e80

Я считаю, что получаю эту ошибку, потому что я использую NSValue, но я не вытаскиваю ее правильно. Как я могу исправить мой геттер?

P.S. Вот как я объявляю свое свойство в заголовочном файле моей категории:

@property (nonatomic, assign) CGRect tapArea;

Кроме того, как я могу установить свое свойство равным рамке кнопки по умолчанию вместо {{0, 0}, {0, 0}}?


person KingPolygon    schedule 08.02.2015    source источник
comment
objc_getAssociatedObject(self, @selector(tapArea)) вероятно возвращает NSString, поскольку эта ошибка говорит о том, что вы пытаетесь выполнить CGRectValue для NSString. Я бы рекомендовал также опубликовать ваш метод objc_getAssociatedObject для более подробного ответа.   -  person Lyndsey Scott    schedule 08.02.2015
comment
Я так понял, за исключением того, что я пытался использовать CGRectFromString(), но, похоже, не могу заставить его работать, не вызывая встроенной ошибки.   -  person KingPolygon    schedule 08.02.2015
comment
@LyndseyScott objc_getAssociatedObject — это метод времени выполнения :)   -  person kovpas    schedule 08.02.2015
comment
Хорошо, тогда я найду это в документах.   -  person Lyndsey Scott    schedule 08.02.2015


Ответы (1)


Вы ужасно усердно работаете, чтобы избежать подкласса UIButton, что чертовски просто и быстро. Не усложняйте задачу больше, чем необходимо.

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

Используйте 1_

person ozz    schedule 08.02.2015
comment
Идеальное объяснение. Спасибо за советы. На данный момент вы правы (учитывая, что у меня есть несколько категорий в UIButton), может быть лучше просто создать подкласс. При этом OBJC_ASSOCIATION_RETAIN_NONATOMIC работал отлично. :D - person KingPolygon; 08.02.2015
comment
вы не должны подклассифицировать UIButton: stackoverflow.com /вопросы/13202161/ - person Tyler; 23.06.2016