0
 AView.m
       UIButton *btn = [[UIButton alloc]initWithFrame()];
       [btn addTarget:self action:@selectior(perpareForSegue:sender:) forControlEvents:UIControlEventTouchUpInside];
       [self.view addSubview:btn];


-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
       //I want to get destinationViewController of segue with identifier"toNextView" 
       // and then perform the segue
       // Difficulties that I encounter is that I have a NSInvalidArgumentException
       // Is that mean the view controller doesn't know the existence of the segue?
       // I have connected two controller with a segue
}

我想用标识符“toNextView”获取segue的destinationViewController,然后执行segue我遇到的困难是我有一个NSInvalidArgumentException这是否意味着视图控制器不知道segue的存在?我已将两个控制器与 segue 连接起来。

4

1 回答 1

0

看看UIStoryboardSegue 的类参考

触发 segue 时,情节提要运行时调用方法prepareForSegue:sender :。它并不意味着被调用来执行segue。

以下是类参考的解释:

当一个 segue 被触发,但在视觉转换发生之前,故事板运行时调用当前视图控制器的 prepareForSegue:sender: 方法,以便它可以将任何需要的数据传递给即将显示的视图控制器。

从类参考:

如果需要,您仍然可以使用 UIViewController 的 performSegueWithIdentifier:sender: 方法以编程方式启动 segue。您可以这样做以从以编程方式添加的源启动 segue,因此在 Interface Builder 中不可用。

因此,只需指定按钮的选择器,然后在选择器内调用performSegueWithIdentifier:sender:方法。

[btn addTarget:self action:@selector(whateverAction) forControlEvents:UIControlEventTouchUpInside];

- (void)whateverAction {
    [self performSegueWithIdentifier:@"toNextView" sender:nil];
}

如果你想将一个对象传递给 segue 的目标视图控制器,那就是 prepareForSegue:sender:方法发挥作用的地方,如类参考中所述,例如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"toNextView"]) {
        DestinationViewController *vc = (DestinationViewController *)[segue destinationViewController];
        //do whatever you want to do with vc, including passing of data, setting property, etc.
    }
}
于 2013-06-01T09:15:56.530 回答