我有两个视图控制器.在视图controller1上我有以下内容:
在我的代码中,我有按钮按下操作的以下内容
@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.
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.
| 归档时间: |
|
| 查看次数: |
14347 次 |
| 最近记录: |