调用performSeguewithIdentifier并不会调用shouldperformseguewithIdentifier

es3*_*dev 43 ios segue swift

我有两个视图控制器.在视图controller1上我有以下内容:

  • 带我到viewcontroller2的segue - 这个segue被命名为"showme"并附加到viewcontroller
  • UIButton的IBAction

在我的代码中,我有按钮按下操作的以下内容

@IBAction func buttonPress(sender: AnyObject) {
    println("button pressed")
        performSegueWithIdentifier("showme", sender: self)
}
Run Code Online (Sandbox Code Playgroud)

我也有以下方法:

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
    println("Should performing....")
    return true
}   
Run Code Online (Sandbox Code Playgroud)

由于某种原因,永远不会调用shouldPerformSegueWithIdentifier函数.但是,如果我直接在UIButton上将segue添加到ViewController2中.

我已经确认在我的按钮动作中调用它的方向是有效的(见下文),但这不是我理解的工作方式.prepareforSegue也是如此.

@IBAction func buttonPress(sender: AnyObject) {
    println("button pressed")
    if (shouldPerformSegueWithIdentifier("showme", sender: self)){
        performSegueWithIdentifier("showme", sender: self)}
} 
Run Code Online (Sandbox Code Playgroud)

nbu*_*urk 77

这种行为非常自然,原因如下:

1)shouldPerformSegueWithIdentifier用于确保触发在Storyboard中设置的segue ,因此只有在Storyboard Segues的情况下才会调用它,并且让您有机会实际执行segue.

2)当你调用performSegueWithIdentifier自己,shouldPerformSegueWithIdentifier不是所谓的,因为它可以假设你知道你在做什么.在呼叫中没有意义performSegueWithIdentifier但是然后NO从中返回shouldPerformSegueWithIdentifier.

  • 一旦你知道答案,这就很明显了……现在多亏了你,我知道了答案!!谢谢! (2认同)

tan*_*one 30

@nburk的回答绝对正确.

但是我知道在某些情况下,shouldPerformSegueWithIdentifier:sender:无论如何都会调用它,也performSegueWithIdentifier:sender:就是在代码中调用时也是如此.

例如,我们想做一些验证来决定是否执行segue,我们希望将这个逻辑保留在一个地方,而不是像以下那样复制所有地方条件:

if (self.shouldPerformSegue) {
     [self performSegueWithIdentifier:identifier sender:sender];
}
Run Code Online (Sandbox Code Playgroud)

这可以很容易地实现performSegueWithIdentifier:sender:,如下:

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if ([self shouldPerformSegueWithIdentifier:identifier sender:sender]) {
        [super performSegueWithIdentifier:identifier sender:sender];
    }
    // otherwise do nothing
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    return self.shouldPerformSegue;
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以使用shouldPerformSegueWithIdentifier:sender:定义逻辑来允许/拒绝IB和代码触发的segue.