调用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
没有意义,但是返回NO
从shouldPerformSegueWithIdentifier
@ 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];