繁体   English   中英

调用performSeguewithIdentifier不会调用应该执行seguewithIdentifier

[英]Calling performSeguewithIdentifier doesn't call shouldperformseguewithIdentifier

我有两个视图控制器。 在视图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)}
} 

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

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

2)当你调用performSegueWithIdentifier自己, shouldPerformSegueWithIdentifier 叫,因为它可以假设你知道你在做什么。 调用performSegueWithIdentifier毫无意义,但是从shouldPerformSegueWithIdentifier返回NO

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

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

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

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和代码触发的序列的逻辑。

作为上面的答案。 如果调用performSegueWithIdentifier shouldPerformSegueWithIdentifier调用shouldPerformSegueWithIdentifier

举个例子:

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

在这种情况下,将需要shouldPerformSegueWithIdentifier

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

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

[self performSegueWithIdentifier:name sender:sender];

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

要大力呼吁shouldPerformSegue之前performingSegue ,您可以覆盖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)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM