调用performSeguewithIdentifier不会调用shouldperformseguewithIdentifier

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

  • 一个segue,带我去viewcontroller2 – 这个segue被命名为“showme”,并附加到viewcontroller
  • 一个UIButton的IBAction

在我的代码中,我有以下的button按下操作

@IBAction func buttonPress(sender: AnyObject) { println("button pressed") performSegueWithIdentifier("showme", sender: self) } 

我也有以下方法:

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

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

我已经确认,在我的button动作工作中调用它的方向(见下文),但这不是我所知道的,它的工作方式。 准备赛报也是如此。

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

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

1) shouldPerformSegueWithIdentifier用于确保在Storyboards中设置的shouldPerformSegueWithIdentifier应该被触发,所以它只在Storyboard Segues的情况下被调用,并且给你机会实际执行Segue

2)当你自己调用performSegueWithIdentifier时,应该调用shouldPerformSegueWithIdentifier 不会被调用,因为可以假设你知道你在做什么。 调用performSegueWithIdentifier没有意义,但是返回NOshouldPerformSegueWithIdentifier

@ nburk答案是绝对正确的。

但是我明白,在某些情况下,如果shouldPerformSegueWithIdentifier:sender:将被调用,当执行shouldPerformSegueWithIdentifier:sender:调用代码时也是有用的。

例如,我们想要做一些validation来决定是否执行segue,我们希望将这个逻辑放在一个地方,而不是像以下那样重复遍布整个地方:

 if (self.shouldPerformSegue) { [self performSegueWithIdentifier:identifier sender:sender]; } 

这可以很容易地实现覆盖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; } 

这样你可以使用shouldPerformSegueWithIdentifier:sender:定义你的逻辑来允许/拒绝IB和代码触发的segues。

作为上面的答案。 如果你调用performSegueWithIdentifier那么shouldPerformSegueWithIdentifier调用shouldPerformSegueWithIdentifier不会被调用。

举个例子:

比方说,你在一个容器视图中embedded了一个segue,以便显示一些你可以滑过的图像。 当VC加载时,embedded的segues会立刻被触发。 但是,如果你不得不从远程API下载图像,你的应用程序将会崩溃,因为在embedded式segue /容器视图中不会显示任何图像。

在这种情况下,将需要执行shouldPerformSegueWithIdentifier

你可以设置一个布尔值,你检查shouldPerformSegueWithIdentifier如果它的false返回false,你的segue不会被解雇。 一旦你的应用程序下载了图像,你可以调用performSegueWithIdentifier

如果你使用这个代码,你需要删除;

[self performSegueWithIdentifier:name sender:sender];