2013-10-09 51 views
4

我有三个按钮,他们都做同样的事情执行segue。全部链接到相同的连接。如何确定哪个按钮被按下了三个按钮

- (IBAction)difficultyButtonPressed:(id)sender { 
    // Any difficulty selected 
    [self performSegueWithIdentifier:@"mainGameTurnGuess" sender:self]; 
} 

我需要做的是确定在prepareForSegue方法中按下了哪个按钮。我如何判断三个按钮中的哪一个被按下。

没有看按钮上的措辞/文字,因为这将改变本地化。

+0

为每个添加不同的“标签”值。 – Wain

+0

我有,但我如何在prepareForSegue中引用它们 – StuartM

+0

创建它们时,请保留对按钮的强烈参考 – LuisCien

回答

8

就可以使用标记值ditermine丈量按钮假设你有一个实例树按钮: -

@property (nonatomic, strong) UIButton *btn1; 
@property (nonatomic, strong) UIButton *btn2; 
@property (nonatomic, strong) UIButton *btn3; 

然后设置类似按钮的标签: -

btn1.tag=1; 
btn2.tag=2; 
btn3.tag=3; 

并为每个设置相同IBAction按钮和: -

[btn1 addTarget:self action:@selector(difficultyButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

[btn2 addTarget:self action:@selector(difficultyButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

[btn3 addTarget:self action:@selector(difficultyButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; 

- (IBAction)difficultyButtonPressed:(UIButton*)sender 
{ 
NSLog(@"Button tag is %d",sender.tag); 

    // you can use if else condition using sender.tag like 

     if(sender.tag==1)//first button related identifire 
     { 
      [self performSegueWithIdentifier:@"mainGameTurnGuess_FirstButtonIdentirier" sender:sender]; 
     } 
     else if(sender.tag==2)//second button related identifier 
     { 
      [self performSegueWithIdentifier:@"mainGameTurnGuess_secondButtonIdentirier" sender:sender]; 
     } 
     else //Third button related identifier 
     { 
      [self performSegueWithIdentifier:@"mainGameTurnGuess_ThirdButtonIdentirier" sender:sender]; 
     } 

} 

对于信息

如果您使用的是IBActionid那么你得到的按钮对象,如: -

- (IBAction)difficultyButtonPressed:(id)sender { 
    UIButton *button = (UIButton *)sender; 
    NSLog(@"Button tag is %d",button.tag); 
} 
+0

你的第一个答案就足够了。感谢这我需要指向UIButton的发件人有这个工作。之前,我只是获取(id)发件人,因此无法访问标签 – StuartM

+0

您无需在此设置中使用标签。而不是比较sender.tag == 1,你可以比较sender == btn1等。 – neilco

+0

@neilco有多种替代方法可以做同样的事情,是的,如果你使用了(id),那么你可以得到选定的按钮对象像**'UIButton * button =(UIButton *)sender' ** –

0

店在一个实例变量按钮的标签,并期待在该变量时prepareForSegue被称为

0

您可以转发sender参数发送到difficultyButtonPressed:,因为这是按下的按钮。也就是说,如果你这样做:

- (IBAction)difficultyButtonPressed:(id)sender { 
    // Any difficulty selected 
    [self performSegueWithIdentifier:@"mainGameTurnGuess" sender:sender]; 
} 

发送到prepareForSegue:sender:将被按下的按钮sender参数。

+0

如果您在按钮IBAction中使用(id)而不是(UIButton *),那么id不是Button对象,那么您必须创建类似于** UIButton * button =(UIButton *)发件人的按钮对象; ** –

+0

@NitinGohel不正确。试试看:将NSLog(@“%@”,sender)'添加到事件处理程序中,您将看到如下所示:'>'。如果您需要访问UIButton的属性和方法特性,则只需将'sender'强制转换为'UIButton'。 – neilco

0

您还可以使用Restoration Id按钮。在prepareForSegue你就可以做到以下几点:

UIButton *btnSender; 
if ([sender isMemberOfClass:[UIButton class]]) 
{ 
    btnSender = (UIButton *)sender; 
} 

// Then you can reference the Restoration Id or a tag of the clicked button to do further conditional logic if you want. 
if([btnSender.restorationIdentifier isEqualToString:@"myBtn1"]) 
{ 
    //do something 
} 

我引述苹果文档:

因为塞格斯可以从多个源引起,可以使用在SEGUE和发件人的参数信息来消除歧义在您的应用中的不同逻辑路径之间。例如,如果segue源自表视图,sender参数将标识用户点击的表视图单元格。您可以使用该信息设置目标视图控制器上的数据