我有一个带有一堆按钮的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'
答案 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
之前为每个按钮执行自定义功能,从而为您的应用提供更多灵活性。
希望这有帮助!