2013-12-10 132 views
0

我讀過,當你想找出被點擊一個按鈕,你可以簡單地使用識別與字符串

button.tag = 10作爲一個例子按鈕。我現在遇到的問題是,我需要使用字符串作爲標識符,因爲id來自服務器,它使用標識符中的單詞和數字來使其唯一。我現在遇到的問題是,我現在不知道該如何識別按鈕,因爲標籤只用於整數。我不能只是迭代它,因爲它必須是完全動態的。將要走什麼路?

我讀過這個鏈接在這裏 How to pass a string as a tag of UIButton

和它說子類的東西,但我是相當新的Objective-C的,所以我不知道,如果這對haard初學者!從用戶@格雷格建議後

編輯代碼

//Class: CustomButton.h 
@interface CustomButton : UIButton 
@property (nonatomic, retain) NSString *stringTag; 
@end 

//Class: MainViewController.m 
#import "CustomButton.h" 
//code 
CustomButton *testButton = [CustomButton buttonWithType:UIButtonTypeRoundedRect]; 
testButton.frame   = CGRectMake(15.0f, _counterForLists, 250.0f, 30.0f ); 

[testButton addTarget   :self action:@selector(deleteListItem:) forControlEvents:UIControlEventTouchUpInside]; 
[testButton setBackgroundColor :[UIColor blackColor]]; 
[testButton setTitleColor  :[UIColor whiteColor] forState:UIControlStateNormal]; 
[testButton setTitle   :[projectData description] forState:UIControlStateNormal]; 

testButton.stringTag = @"TEST"; 
_counterForLists += 30; 
[self.view addSubview:testButton  ]; 

//Method deleteListItem (When I press the button it crashes) 

- (void)deleteListItem:(CustomButton *)sender{ 
    NSLog(@"Button clicked with ID: %@", sender.stringTag); 

} 
+0

'NSDictionary'? – 2013-12-10 10:58:39

回答

0

您可以創建的UIButton的子類,並添加標識屬性:

@interface MyButton : UIButton 
@property (nonatomic, strong) NSString *tagAsString; 
@end 

而且每一個地方,你使用的UIButton與myButton的更換,比如時間: 舊代碼

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    [btn setFrame:CGRectMake(0.0f, 0.0f, 50, 30)]; 
    [btn setTitle:@"Your title" forState:UIControlStateNormal]; 
    btn.tag = 1; 
    [btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view btn]; 

有:

 MyButton *btn = [MyButton buttonWithType:UIButtonTypeRoundedRect]; 
     [btn setFrame:CGRectMake(0.0f, 0.0f, 50, 30)]; 
     [btn setTitle:@"Your title" forState:UIControlStateNormal]; 
     btn.tagAsString = @"string as a identifier"; 
     [btn addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside]; 
     [self.view btn]; 

而且你仍然可以使用標籤屬性。

//擴展

您不能使用標準的方法,像viewWithTag :,你應該創建自己的,例如:

-(MyButton*)buttonForTag:(NSString*)tagAsString 
{ 
    for (UIView *v in self.view.subviews) 
    { 
     if ([v isKindOfClass:[MyButton class]]) 
     { 
      MyButton *btn = (MyButton*)v; 
      if ([btn.tagAsString isEqualToString:tagAsString]) 
       return btn; 
     } 
    } 
} 

希望這有助於。

+0

嗨。謝謝。這似乎很容易!我現在已經完成了。但現在,當我有另一個按鈕,刪除一個依賴於ID的按鈕。我會怎麼做?只需使用我正在搜索的tagAsString搜索按鈕?或者究竟是什麼?那我該如何比較呢? – NewToObjectiveC

+0

要讀取標識符,您可以使用btn.tagAsString。您可以將其作爲NSString進行比較,如果需要,您可以根據比較結果刪除按鈕。 – Greg

+0

嗯,很奇怪。我照你說的做了。將該屬性添加到我也在ViewController.m中導入的接口中,並使用CustomButton而不是UIButton,但它給了我一個例外。原因是什麼? 由於未捕獲的異常'NSInvalidArgumentException',原因:' - [UIButton setStringTag:]:無法識別的選擇器發送到實例0xa7e2ee0' 終止應用程序是否因爲我的標識符以'-'開頭?如果是的話,我該如何逃避? – NewToObjectiveC

0

標籤只能是一個整數,如果你需要使用的NSString作爲標識你的子類的UIButton,添加一個新的NSString屬性稱爲buttonID(例如)並使用該按鈕。

2

無需創建子類UIButton如果我們只是通過執行以下操作將我們只要創建一個新的類別的新屬性爲UIButton一個全新的類:

的UIButton + properties_cat.h

#import <UIKit/UIButton.h> 
#import <objc/runtime.h> 

@interface UIButton (properties_cat) 

@property (nonatomic, strong) NSString *nameTag; 

@end 

UIButton + properties_cat。^ h

#import "UIButton+properties_cat.h" 

@implementation UIButton (properties_cat) 

// We can't use synthesize with categories so we have to use dynamic. 
@dynamic nameTag;  

#pragma mark - Setters and Getters for nameTag Property 
- (void)setNameTag:(NSString *)nameTag 
{ 
    objc_setAssociatedObject(self, @"nameTag", nameTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (NSString *)nameTag 
{ 
    return objc_getAssociatedObject(self, @"nameTag"); 
} 

@end 

然後確保通過做#import "UIButton+properties_cat.h"

導入新的類到您的代碼一旦我們有#imported它,我們現在可以在課堂上使用它像這樣

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[btn setNameTag:@"my button name"]; 

注意我們仍在使用UIButton而不是創建一個毫無意義的新課程,如MyButton我們剛剛將新屬性(nameTag)添加到現有的UIButton課程中。

UPDATE

這是基於另一個答案評論的更新。

因此,您希望能夠訪問您在另一種方法中完成的按鈕?

好吧,讓我們改進上面的代碼。我們可以將nameTag應用於UIButton,而不是將其應用於UIButton繼承的UIView。於是,這將允許我們申請nameTag任何東西,從UIView繼承 - UILabelUIButton

我們也想實現一個名爲viewWithName:新方法,這將工作方式相同viewWithTag:除了它會檢查nameTag代替tag

所以請嘗試使用下面的代碼:

的UIView + cat.h

#import <UIKit/UIView.h> 
#import <objc/runtime.h> 

@interface UIView (cat) 

@property (nonatomic, strong) NSString *nameTag; 

- (UIView *)viewWithName:(NSString *)name; 

@end 

的UIView + cat.m

#import "UIView+cat.h" 

@implementation UIView (cat) 

@dynamic nameTag; 

#pragma mark - viewWithName: method 

- (UIView *)viewWithName:(NSString *)name 
{ 
    for(id view in [self subviews]) { 
     // This if statement checks that the view is an instance of UIView class 
     // or inherits from it, so it should return true if like UILabel. 
     if([view isKindOfClass:[UIView class]]) { 
      if([[view nameTag] isEqualToString:name]) { 
       // This will return the first view that it comes across with the nameTag that equals name 
       return view; 
      } 
     } 
    } 
    return nil; 
} 

#pragma mark - Setters and Getters for nameTag Property 
- (void)setNameTag:(NSString *)nameTag 
{ 
    objc_setAssociatedObject(self, @"nameTag", nameTag, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
} 

- (NSString *)nameTag 
{ 
    return objc_getAssociatedObject(self, @"nameTag"); 
} 

@end 

現在,而不是導入UIButton+properties_cat.h我們需要導入UIView+cat.h這是因爲我們不需要創建UIButton+properties_cat.h,因爲UIButton繼承自UIView所以它不會我選擇新的屬性和方法。

所以一旦我們導入UIView+cat.h我們就可以設置我們UIButtonnameTag像:

UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
[btn setNameTag:@"my button name"]; 

然後在另一種方法,我們希望訪問按鈕,我們可以做

UIButton *btn = (UIButton *)[[self view] viewWithName:@"my button name"]; 

我們增加因爲viewWithName:將會返回一個UIView我們想確保它是UIButton的一個實例。在Customizing Classes with Categories

如果您需要任何更多的只是問

更多信息。

+0

+1。但我已經用格雷格的回答解決了它。無論如何,你的看起來非常好,合乎邏輯,因爲我不需要創建子類。但是我甚至不知道你用'UIButton + properties_cat.h'表示你的意思,但是謝謝! – NewToObjectiveC

+0

這只是命名文件的慣例。 'UIButton'因爲你添加到'UIButton'和'properties_cat',因爲'properties_cat'是你的新類別的名字,所以文件名會變成'UIButton + properties_cat.h',你可以任意命名它,會這樣做。 – Popeye

+0

嗨,是的,這是我理解的部分。我不明白的部分是,我在哪裏創建這些文件,以及如何創建它們,或者我在哪裏編寫這些文件。我只是創建一個新文件並將其命名爲UIButton + properties_cat.h?這是我不明白的部分!我是新來的。對不起! – NewToObjectiveC