具有相同segueIdentifer的多个按钮

时间:2014-10-28 17:28:50

标签: ios objective-c segue uistoryboard

我有一个带有一堆按钮的tableviewController,当它们被点击时,我想推送到一个新的视图控制器,我正在使用prepareForSegue方法,然后在故事板中使用控制拖动。

在prepareForSegue中,我有

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showItems"]) {
}

然后我发送到下一个视图控制器的一堆东西,所以在故事板中我的所有按钮都有相同的标识符“showItems”,这给我一个警告"Multiple segues have same identifer showItems"什么是最好的摆脱这个警告的方法?我仍然希望所有按钮都做同样的事情,这是推动下一个viewController的更好的做法。

感谢您的帮助。

修改

- (IBAction)showItems:(id)sender{

    [self performSegueWithIdentifier:@"showItem" sender:self];
}

我已将所有按钮连接到IBAction,但是我将数据传递到下一个视图控制器?

在PrepareForSegue中我有

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {

UIButton *senderButton=(UIButton *)sender;

NSInteger meal = senderButton.tag % 10;
}

但这会抛出异常unrecognized selector sent to instance 0x7fcc1a496880 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DiningMealsTableViewController tag]: unrecognized selector sent to instance 0x7fcc1a496880'

2 个答案:

答案 0 :(得分:4)

您可以使用从tableviewController到另一个viewController的控制拖动来创建单个segue,并在按钮的IBAction中触发segue。您只能为所有按钮创建一个IBAction,并使用sender参数识别按钮。

答案 1 :(得分:1)

您只需要一个segue标识符,用于标识从一个UIViewController到另一个UIViewController的移动。然后在"呼叫" UIViewcontroller(拥有tableview和按钮的UIViewController)你可以使用每个按钮都会调用的自定义函数来触发Segue。

像这样:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Create the buttons and assign them unique tags
    // and assign them a custom click handler 
    UIButton *button1 = [[UIButton alloc] initWithFrame:button1Frame];
    button1.tag = 1;
    [button1 addTarget:self action:@selector(handleButtonPress:) forControlEvents:UIControlEventTouchUpInside];

    UIButton *button2 = [[UIButton alloc] initWithFrame:button2Frame];
    button2.tag = 2;
    [button2 addTarget:self action:@selector(handleButtonPress:) forControlEvents:UIControlEventTouchUpInside];

    // Add the buttons to the view or to your UITableViewCell
    [self.view addSubview:button1];
    [self.view addSubview:button2];
}

- (void)handleButtonPress:(id)sender {

    // get the tag you assigned to the buttons
    // to identifiy which one was pressed
    UIButton *btn = sender;
    int tag = btn.tag;
    NSLog(@"You clicked button with tag: %d", tag);

    if (tag == 1){
        NSLog(@"You clicked on Button1");
        // Do something custom here.
    } else if (tag == 2) {
        NSLog(@"You clicked on Button2");
        // Do something custom here.
    }

    // Now this is where all your buttons can call the same SegueIdentifier
    [self performSegueWithIdentifier:@"showItems" sender:sender];

}

显然,我不太了解应用程序的结构,我的示例将按钮添加到根视图,在您的应用程序中,您将使用相同的设置,仅附加到您放置在{ {1}}但是这种方法可以让多个按钮触发同一个序列,而不必在多个位置显式分配一个seque标识符。它还具有以下优点:能够在调用UITableViewCell之前为每个按钮执行自定义功能,从而为您的应用提供更多灵活性。

希望这有帮助!