基于斯坦福iOS课程,我正在使用模态视图控制器。在演示中,他们有一个按钮可以启动模态视图,当它被点击时,函数prepareForSegue被调用。我将代码和实现模仿到我的项目中,唯一的区别是我的演示是在iPhone故事板上,而他们的是在iPad上。
我注意到,虽然我的模态视图控制器即将出现,但在此之前它不会调用prepareForSegue。在查看prepareForSegue之前,我搜索了斯坦福项目,看看他们可以在哪里注册任何segue行为,但是没有证据。任何人都可以对此有所了解。我搜索了堆栈溢出,我发现所有用户都缺少performSegueWithIdentifier的调用实现。然而,在斯坦福大学的演示中他们从未这样做过。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier hasPrefix:@"Create Label"]) {
AskerViewController *asker = (AskerViewController *)segue.destinationViewController;
asker.question = @"What do you want your label to say?";
asker.answer = @"Label Text";
asker.delegate = self;
}
}
以下是故事板的示例:
以下是我的故事板示例:
在调试器中,当我停在斯坦福演示代码中时,调用堆栈显示故事板正在执行segue操作,我需要在故事板中配置什么才能获得相同的结果?
答案 0 :(得分:30)
嗯,事实证明,我的视图控制器按钮调用模态视图没有正确的类,其中实现了prepareForSegue。这是默认的UIViewController,而不是我的自定义类。
我想出来的方法是在viewDidLoad中设置一个断点,甚至没有破坏,因此我怀疑在故事板中我没有与实现按钮的视图相关联的正确类。
答案 1 :(得分:10)
当连接表格视图的自动segue时,除了Amro的答案(不指定相应的子类)之外,还有另外两种可能不会调用prepareForSegue
的情况。确保您:
答案 2 :(得分:10)
对于有这个问题的其他人,如果你现在使用的Swift 3具有以下功能,则不会抛出错误,因为它是正确的语法,但它不起作用,因为它是Swift 2函数:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// code
}
您必须更新到Swift 3"准备"它的功能是为segues工作:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
答案 3 :(得分:5)
代码下面的Modal或Push Segue是否总是被称为
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"Create Label"]) {
SignUpViewController *asker = segue.destinationViewController;
}
}
答案 4 :(得分:2)
在我的情况下,它因为我的控制器正在扩展另一个控制器(Eureka Form View Controller = FormViewController)而实现了如下所示的performSegue函数:
open override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
我的功能是这样实现的:
func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
为了解决这个问题,我在之前添加了覆盖:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// code
}
瞧!
答案 5 :(得分:1)
我有UICollectionViewCell
作为segue来源的类似问题
似乎故事板segue工作(没有performSegueWithIdentifier
),你需要有UICollectionViewCell
的自定义子类,并将其用作Class
的{{1}}故事板。
答案 6 :(得分:1)
就我而言,我没有在包含segue的视图控制器的故事板中将该模块设置在类的名称下。它被设置为none,一旦我点击模块字段,它就会设置为正确的项目/模块,并解决了问题。
答案 7 :(得分:1)
我有类似的问题。
思考过程是:
答案 8 :(得分:0)
就我而言,我的项目中有几个视图控制器的基类。该基类具有prepareForSegue()
的实现,在每种情况下都没有被调用。问题是我的一个视图控制器继承自基类并覆盖了它的prepareForSegue()
实现,我忘了打电话给super.prepareForSegue()
。
答案 9 :(得分:-1)
首先你必须选择按钮+ ctrl拖动项目来查看控制器选择segue。后来,你必须正确命名segue标识符。
不要将一个视图控制器连接到其他视图控制器。 为此导入UIKit.framework 然后这个方法就会被调用。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"identifierName"])
{
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
ExampleViewController *destViewController = segue.destinationViewController;
}
}