Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当我在没有使用performSegueWithIdentifier的情况下单击按钮时,prepareForSegue不会被调用_Ios_Iphone_Objective C_Segue_Uistoryboardsegue - Fatal编程技术网

Ios 当我在没有使用performSegueWithIdentifier的情况下单击按钮时,prepareForSegue不会被调用

Ios 当我在没有使用performSegueWithIdentifier的情况下单击按钮时,prepareForSegue不会被调用,ios,iphone,objective-c,segue,uistoryboardsegue,Ios,Iphone,Objective C,Segue,Uistoryboardsegue,基于斯坦福iOS课程,我正在玩模态视图控制器。在演示中,他们有一个按钮,可以启动一个模态视图,单击该按钮时,将调用函数prepareForSegue。我在我的项目中模拟了代码和实现,唯一的区别是我的演示在iPhone情节串连板上,他们的演示在iPad上 我注意到,当我的模态视图控制器出现时,在此之前它不会调用prepareForSegue。在调用prepareForSegue之前,我搜索了斯坦福项目,看看他们可能在哪里记录任何segue行为,但没有证据。有人能解释一下吗。我搜索了stack ov

基于斯坦福iOS课程,我正在玩模态视图控制器。在演示中,他们有一个按钮,可以启动一个模态视图,单击该按钮时,将调用函数prepareForSegue。我在我的项目中模拟了代码和实现,唯一的区别是我的演示在iPhone情节串连板上,他们的演示在iPad上

我注意到,当我的模态视图控制器出现时,在此之前它不会调用prepareForSegue。在调用prepareForSegue之前,我搜索了斯坦福项目,看看他们可能在哪里记录任何segue行为,但没有证据。有人能解释一下吗。我搜索了stack overflow,只发现用户缺少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;
    }

}
下面是一个故事板示例:

以下是我的故事板示例:

在调试器中,当我在Stanford演示代码中停止时,调用堆栈显示序列图像板正在执行一个segue操作,我需要在序列图像板中配置什么才能获得相同的结果?

事实证明,button调用模态视图的视图控制器没有实现PrepareForsgue的正确类。它是默认的UIViewController,而不是我的自定义类


我的解决方法是在viewDidLoad中放置断点,即使它没有中断,因此我怀疑在故事板中,我没有与实现按钮的视图关联的正确类。

代码下面的模式或按钮序列将始终被调用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"Create Label"]) {
        SignUpViewController *asker = segue.destinationViewController;
    }
}

首先,您必须在按钮上选择并按住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;
    }
}

在为表视图连接自动segue时,除了Amro的答案(不分配相应的子类)之外,还有两种情况下,
prepareforsgue
可能不会被调用。确保您已经:

  • 从表视图原型单元连接segue,而不是表视图控制器

  • 使用segue connection弹出菜单中“Selection segue”组下的segue,而不是“Accessory Action”下的segue


  • [单击图像放大]

    我在使用
    UICollectionViewCell
    作为segue的源时遇到了类似的问题。

    似乎要使故事板序列正常工作(没有
    performsguewithidentifier
    ),需要有一个自定义子类
    UICollectionViewCell
    ,并将其用作故事板上
    CollectionViewCell

    在我的例子中,我没有在包含segue的视图控制器的故事板中以类的名称设置模块。它被设置为无,一旦我在模块字段中单击,它就设置为正确的项目/模块并解决了问题。

    我也遇到了类似的问题

    思考过程是:

  • 确保您具有正确的方法签名。它在Swift 3中发生了变化
  • 然后确保你连接按钮的方式(或触发segue的任何方式)与你在故事板中连接segue的方式相匹配。有时您调用一个按钮,但尚未将该按钮的序列正确连接到目标viewcontroller
  • 确保序列的标识符正确无误。虽然这不是prepareForSegue没有被调用的原因,但这只是特定segue没有被调用的原因

  • 在我的例子中,之所以出现这种情况,是因为我的控制器扩展了另一个控制器(Eureka Form View controller=FormViewController),该控制器实现了以下performsgue函数:

    open override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // code
    }
    
    func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // code
    }
    
    我的功能是这样实现的:

    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
    }
    

    在我的例子中,我的项目中有几个视图控制器的基类。该基类有一个
    prepareforsgue()
    的实现,并不是在所有情况下都被调用。问题是,在我从基类继承并重写其
    prepareforsgue()
    实现的一个视图控制器中,我忘了调用
    super.prepareforsgue()

    ,以解决此问题,如果您现在使用的是Swift 3,则以下函数不会抛出错误,因为这是正确的语法,但它不会工作,因为它是Swift 2函数:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        // code
    }
    
    您必须更新到Swift 3“准备”功能,才能使其用于分段:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // code
    }
    

    您如何知道未调用
    prepareforsgue:
    ?我敢打赌,它正在被呼叫。确保的唯一方法是在其中的第一条语句上设置断点。你做到了吗?是的,我做到了,这就是我问这个问题的原因。在我的演示中,没有调用我的预变形,但在斯坦福演示中调用了。做得好。你学到了一些重要的东西!这是一个容易犯的错误,你会犯很多次。:)我不愿承认,我以前犯过这个错误。真不敢相信我花了一段时间才弄明白这件事!不,它不总是从UITableViews导航对我来说,我尝试使用另一个我知道有效的segue,但我必须重新创建它。虽然处理得很好,但当Swift 2方法不兼容且在Swift 3中表现不明显时,苹果发出的某种警告或错误可能会有所帮助。不幸的是,事实并非如此,谢谢你的回答,它起作用了,谢谢!最有帮助的+1辅助动作是关于
    ,等等。有关更多信息,请参阅