2013-04-11 144 views
2

好的我有一個特定的情況。我使用的是自定義的類來創建一些按鈕,我可以用喜歡的唯一號碼設置它們的標籤屬性:通過UIButton傳遞多個標籤

button.tag =[NSNumber numberWithInt:[10]]; 

這是我的程序的其他部分非常有用,因爲我可以訪問此獨特的標籤,如:

UIButton *clicked= (UIButton *) sender; 

ButtonTag = [NSString stringWithFormat:@"%d", clicked.tag]; 

現在我想傳遞一個像這樣的獨特屬性。我在做這件事,但是這是我想象它

button.tagCREATED_BY_ME =[NSNumber numberWithInt:[9000]]; 

的問題可能是措辭很差,但我不知道任何更好,所以我把它叫做「標籤」。(正確寫法可能是元素/屬性等)如何創建類似的屬性來像.tag一樣運行?

非常感謝! arda

回答

2

在你的子類/自定義按鈕,你可以添加任何一個你感覺良好的字符串屬性甚至整數屬性。

@interface CustomButton: .... 
     ... 
     @property(strong) NSString *createdBy; 

@end 

然後你就可以訪問這些爲aButton.createdBy

+1

這是非常簡單的工作。這就是我一直在尋找的! – ardavar 2013-04-11 18:02:20

0

您可以繼承UIButton

在你的子類,添加新的屬性:

@property (strong, nonatomic) NSNumber *tagCREATED_BY_ME; 
0

你可以看看KVC

或者如果你想堅持KISS原則 - 子類UIButton並創建一個屬性。

1

您也可以使用相關的引用,而不是標籤操作的

#import <objc/runtime.h> 

static char kThumbnailButtonAssociatedPhotoKey; 

// ... 

- (void)setAssociatedPhoto:(Photo *)associatedPhoto 
     forThumbnailButton:(UIButton *)thumbnailButton 
{ 
    objc_setAssociatedObject(thumbnailButton, 
          &kThumbnailButtonAssociatedPhotoKey, 
          associatedPhoto, 
          OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (Photo *)associatedPhotoForThumbnailButton:(UIButton *)thumbnailButton 
{ 
    return objc_getAssociatedObject(thumbnailButton, 
            &kThumbnailButtonAssociatedPhotoKey); 
} 

現在,我們可以很容易地設置/獲取一個按鈕的相關照片:

- (void)configureThumbnailButtonForPhoto:(Photo *)photo 
{ 
    // ... 
    [self setAssociatedPhoto:photo 
      forThumbnailButton:thumbnailButton]; 
    // ... 
} 

- (void)thumbnailButtonTapped 
{ 
    Photo *photo = [self associatedPhotoForThumbnailButton:thumbnailButton]; 
    // ... 
} 

Blog post about tags and associated references

+0

真棒博客,謝謝! – Matt 2013-06-15 21:39:15

3

你這是什麼想要實現?

有可能添加關聯引用。關於這一點的好處是,你不需要對它進行分類。因此,通過創建UIButton類別入手:

@interface UIButton (ExtraTag) 

@property (nonatomic, retain) id extraTag; 

@end 

與.m:

static char const * const ExtraTagKey = "ExtraTag"; 

@implementation UIButton (ExtraTag) 
@dynamic extraTag; 

- (id)extraTag { 
    return objc_getAssociatedObject(self, ExtraTagKey); 
} 

- (void)setExtraTag:(id)newExtraTag { 
    objc_setAssociatedObject(self, ExtraTagKey, newExtraTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

You can check the article I used

+0

好戲。我曾使用過這個,但我無法添加關聯的密鑰。謝謝。 – 2014-05-14 06:32:30

1

CALayer實際允許Key-Value coding

你可以從字面上只是這樣做(在任何UI對象):

[button.layer setValue:@(9000) forKey:@"tagCREATED_BY_ME"];

,並讀它只是使用

[button.layer valueForKey:@"tagCREATED_BY_ME"]




強制性的,以上是你需要得到這個起起落落,你很好去。

對於其他人來說,更先進的/或/具體的東西如下:

如果你需要這些按鍵有默認值時,沒有尚未分配給他們的。您可以設置這些自定義「標籤「(eh)如果您根據模式對其進行命名,則具有默認返回值。例如,我用「customKey_」開始我所有的圖層關鍵字名稱。所以上面是@「customKey_tagCREATED_BY_ME」,那麼你可以讓你的.m文件爲masksToBounds之類的任何標準鍵返回默認鍵值,但是爲你的鍵返回一個非常具體的值(也就是以「customKey_」開頭的鍵)用下面的方法:

+(id)defaultValueForKey:(NSString *)key { 
    if ([key hasPrefix:@"customKey_"]) { 
     return @(0); 
    } 
    return [CALayer defaultValueForKey:key]; 
} 

你必須有一個命名模式(像往常一樣具有suffic「customKey_」)的原因是這樣你就不會用的CALayer的自然屬性interefere像.size.backgroundColor等。您返回的默認值只會返回到以「customKey_」開頭的屬性(鍵)或您使用的任何命名模式。