2013-01-04 73 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我的按鈕必須能夠沿着它的選擇器傳遞對象。 :)太棒了 –

+2

'OBJC_ASSOCIATION_ASSIGN'只會使用弱引用。如果沒有其他引用到您的對象,它將被釋放,您將得到一個懸掛指針,並且Bad Things™將會發生。除非您有特定的理由使用'OBJC_ASSOCIATION_ASSIGN',否則使用'OBJC_ASSOCIATION_RETAIN_NONATOMIC'。 –

0

可以使用Objective-C運行的關聯對象功能將對象與另一個對象關聯起來:

void objc_setAssocia tedObject(ID對象,鍵,值無效* ID,objc_AssociationPolicy政策)

ID objc_getAssociatedObject(ID對象,無效*鍵)

此外,投票結束。在許多其他

How to add properties to NSMutableArray via category extension?

Adding custom behavior and state to all my classes

:重複的。

編輯:

我同意你的問題對@ Paul.s的評論。將數據附加到按鈕聽起來很麻煩。不知道你在做什麼,我會建議標記按鈕,然後讓你的視圖控制器處理根據按鈕的標籤獲取你需要的任何數據。

0

你想要的是創建一個UIButton category。類別被設計爲擴展現有類的功能的一種方式。一旦創建了一個設置,您只需要導入該類別,並且可以在其設計的類的任何實例上使用它的功能。