2011-06-07 24 views
0

我創建了一個名爲TaskUIButton的自定義按鈕,它從UIButton繼承。我現在唯一的區別是「va」屬性。檢索Objective-C中的自定義按鈕屬性

這裏的接口

// TaskUIButton.h 
@interface TaskUIButton : UIButton 
{ 
NSString *va; 
} 
@property(nonatomic, retain) NSString *va; 
@end 

和實現文件

//TaskUIButton.m 
@implementation TaskUIButton 
@synthesize va; 

@end 

現在,我已經得到了我使用,我想用它來設置和檢索VA屬性的動作一個按鈕(僅用於測試/實驗當然)。

這裏就是按鍵動作

- (IBAction)setAndRetrieveVa:(id)sender{ 

TaskUIButton *imaButton = [TaskUIButton buttonWithType:UIButtonTypeRoundedRect]; 
imaButton.va = @"please work"; 
NSLog(@"%@", imaButton.va); 
} 

在激活setAndRetrieveVa:動作,我的應用程序崩潰,並:

-[UIRoundedRectButton setVa:]: unrecognized selector sent to instance 0x4b3a5a0 

我敢肯定,它對我而言一個愚蠢的錯誤,但我一直在尋找一段時間,並會喜歡一些見解!

謝謝!

回答

4

你得到這個是因爲buttonWithType:正在返回一個新的對象,它是一個UIRoundedRectButton對象,它是UIButton的子類。你不能改變方法的這種行爲,除非你重寫,但你不可能得到你想要的。你應該採取alloc-init的方法。

使用關聯參考

您需要#import <Foundation/NSObjCRuntime.h>這個工作。

要設置,

objc_setAssociatedObject(button, "va", @"This is the string", OBJC_ASSOCIATION_RETAIN); 

並檢索,

NSString * va = (NSString *)objc_getAssociatedObject(button, "va"); 

這樣你就不會需要繼承UIButton

+0

果然,這似乎解決了它!謝謝:D我會告訴你,如果我遇到這種方法的任何問題。 – hemlocker 2011-06-07 20:14:28

+0

嗯。當我實際嘗試在視圖上顯示自定義按鈕時,它們不顯示。我猜這是因爲按鈕沒有「buttonType」屬性集。但是,由於buttonType是一個只讀屬性,我無法使用點語法來設置它。無論如何,我可以使用alloc-init方法設置buttonType嗎? – hemlocker 2011-06-07 20:59:05

+0

不可以。你不能設置它。一旦你繼承它,它將默認爲'UIButtonStyleCustom'。您將必須定義一個框架,設置圖像或覆蓋它的'drawRect'方法。 – 2011-06-07 21:04:31

0

我最終只是延長UIControl ......原來是一個容易得多:)

- (IBAction)setAndRetrieveVa:(id)sender{ 

TaskUIButton *newTaskButton = [[TaskUIButton alloc] initWithFrame:CGRectMake(29.0, (76.0+ (88*taskCounter)), 692, 80.0)]; 
[newTaskButton addTarget:self action:@selector(function1:)forControlEvents:UIControlEventTouchUpInside]; 
[newTaskButton addTarget:self action:@selector(function2:) forControlEvents:UIControlEventTouchDragExit]; 
[newTaskButton setBackgroundColor:[UIColor grayColor]]; 
[newTaskButton setTitle:@"0" forState:UIControlStateNormal]; 
[newTaskButton setVa:@"please work!"]; 
NSLog(@"%@", newTaskButton.va); 
} 

而對於點擊突出,我可以隨時添加,當觸摸開始發生改變背景色的功能,並在發生接觸時切換顏色。歡呼!

相關問題