ios-调用performSeguewithIdentifier不会调用shouldperformseguewithIdentifi

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

  • 将我带到viewcontroller2的segue-此segue名为“ showme”,并附加到viewcontroller
  • UIButton的IBAction

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

@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。

我已经确认在按钮操作中将其称为方向是可行的(请参见下文),但这不是我所理解的那样。 prepareforSegue也是如此。

@IBAction func buttonPress(sender: AnyObject) {
    println("button pressed")
    if (shouldPerformSegueWithIdentifier("showme", sender: self)){
        performSegueWithIdentifier("showme", sender: self)}
} 
es3dev asked 2020-07-31T05:32:59Z
5个解决方案
76 votes

此行为是完全自然的,原因如下:

1)performSegueWithIdentifier用于确保应该触发在情节提要中设置的segue,因此仅在Storyboard Segues的情况下才调用它,并且使您有机会不实际执行此情节。

2)当您自己致电performSegueWithIdentifier时,不会调用shouldPerformSegueWithIdentifier,因为可以假定您知道自己在做什么。 调用performSegueWithIdentifier没有任何意义,但是从shouldPerformSegueWithIdentifier返回NO

nburk answered 2020-07-31T05:33:24Z
29 votes

@nburk的答案是绝对正确的。

但是我知道,在某些情况下,无论如何都要调用shouldPerformSegueWithIdentifier:sender:,这也很有用,而且在代码中对performSegueWithIdentifier:sender:的调用也是如此。

例如,我们想要进行一些验证来决定是否执行序列检测,并且希望将此逻辑保持在单个位置,而不是像以下那样在所有位置条件下重复:

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

可以很容易地实现这一点,从而可以覆盖shouldPerformSegueWithIdentifier: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和代码触发的序列的逻辑。

tanzolone answered 2020-07-31T05:34:02Z
3 votes

作为上面的答案。 如果您致电shouldPerformSegueWithIdentifier,则不会呼叫shouldPerformSegueWithIdentifier

举个例子:

假设您在容器视图中有一个嵌入式segue,以便显示一些可以滑动的图像。 当您加载VC时,嵌入式segue会立即被触发。 但是,如果您必须从远程API下载图像,则由于嵌入的segue / container视图中不会显示任何图像,因此应用程序将崩溃。

在这种情况下,将需要shouldPerformSegueWithIdentifier

您可以设置一个布尔值,如果它的false返回false并且不会触发您的segue,则在shouldPerformSegueWithIdentifier中检查该值。 一旦您的应用下载了图像,就可以调用performSegueWithIdentifier

user2722667 answered 2020-07-31T05:34:41Z
0 votes

如果您正在使用此代码,则需要删除;

[self performSegueWithIdentifier:name sender:sender];

alicanozkara answered 2020-07-31T05:35:03Z
0 votes

感谢@tanzolone提供完美的解决方案。 在Swift 5上重写代码

要在performingSegue之前强制致电shouldPerformSegue,可以在您的课程中覆盖performingSegue

override func performSegue(withIdentifier identifier: String, sender: Any?) {
    if shouldPerformSegue(withIdentifier: identifier, sender: sender) {
        super.performSegue(withIdentifier: identifier, sender: sender)
    }
}

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    // Your code (return true if you want to perform the segue)
}
Vergiliy answered 2020-07-31T05:35:28Z
translate from https://stackoverflow.com:/questions/26946566/calling-performseguewithidentifier-doesnt-call-shouldperformseguewithidentifier