2013-01-04 4 views
-3

Можно создать дубликат:
Subclass UIButton to add a propertyПродлить свойства класса из класса UIKit (нет доступа к @implementation)

Я пытаюсь найти способ продлить UIButton так, что он может имеют свойство, как

@property(assign, nonatomic) id userInfos; 

без подклассов его ...

Возможно ли это?

button.tag не хватает в моей ситуации ...

Хорошо, как всегда лучший ответ доступен здесь

Subclass UIButton to add a property

+1

См. [Подкласс UIButton для добавления свойства] (http: // stackoverflow.com/questions/5500327/subclass-uibutton-to-add-a-property /) – Joe

+4

Из интереса, что вы на самом деле добавляете? Это похоже на запах кода для меня. –

+1

Я согласен с Полом. Похоже, что разделение MVC здесь не соблюдается. Кнопки не должны ничего знать о том, что происходит в остальной части приложения. Кнопки просто информируют ваш контроллер о состоянии изменений состояния (нажаты, выпущены и т. Д.). Контроллер вашего представления, которому принадлежит кнопка, должен обрабатывать эти события и извлекать данные. –

ответ

2

Это очень легко с помощью Objective-C, связанные объекты:

В вашем заголовке:

@interface UIButton (MyCustomProperty) 
@property (readwrite, retain, nonatomic) id myCustomProperty; 
@end 

В файле реализации:

#include <objc/runtime.h> 

/* Associated objects need a unique memory location to use as a key. */ 
static char MyCustomPropertyKey = 0; 

@implementation UIButton (MyCustomProperty) 
/* Use @dynamic to tell the compiler you're handling the accessors yourself. */ 
@dynamic myCustomProperty; 

- (id)myCustomProperty { 
    return objc_getAssociatedObject(self, &MyCustomPropertyKey); 
} 

- (void)setMyCustomProperty: (id)anObject { 
    objc_setAssociatedObject(self, &MyCustomPropertyKey, anObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 
@end 

Вот именно!

+0

Я пробую ваш ответ прямо сейчас, вернусь к вам через минуту. Оно работает! Я, однако, предпочитаю OBJC_ASSOCIATION_ASSIGN, моя кнопка должна просто передавать объект по его селектору. :) Awesome –

+2

'OBJC_ASSOCIATION_ASSIGN' будет использовать только слабую ссылку. Если нет другой ссылки на ваш объект, она будет освобождена, вы получите свисающий указатель, и Bad Things ™ произойдет. Если у вас нет конкретной причины использовать 'OBJC_ASSOCIATION_ASSIGN', используйте' OBJC_ASSOCIATION_RETAIN_NONATOMIC'. –

0

Вы можете использовать Objective-C во время выполнения ассоциированных объектов функций к ассоциированный объект с другим объектом:

void objc_setAssocia tedObject (идентификатор объекта, аннулируются ключ, значение * идентификатор, objc_AssociationPolicy политика)

идентификатор objc_getAssociatedObject (идентификатор объекта, аннулируются * ключ)

Кроме того, голосование закрыто. Дубликат:

How to add properties to NSMutableArray via category extension?

Adding custom behavior and state to all my classes

среди многих других.

Edit:

Я также согласен с комментарием на ваш вопрос по @ Paul.s. Прикрепление данных к кнопке кажется беспорядочным. Не зная, что вы делаете, я предлагаю пометить кнопку, а затем обработать обработчик вашего вида, используя нужные данные на основе тега кнопки.

0

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

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