Ios Xcode 6情节提要展开序列,Swift未连接到退出

Ios Xcode 6情节提要展开序列,Swift未连接到退出,ios,swift,xcode,uibarbuttonitem,Ios,Swift,Xcode,Uibarbuttonitem,当尝试将导航栏按钮连接到Xcode 6中ViewController的退出项时(不确定这是否是Xcode 6问题,但值得一提,因为它在beta版中),在自定义类中找不到Swift函数 它应该找到的函数: @IBAction func unwindToList(segue: UIStoryboardSegue) { } 我在视图上做了另一个按钮,只是为了确保我可以得到一个与Swift一起工作的iAction,并且我写的是正确的。这很好: @IBAction func test(sender:

当尝试将导航栏按钮连接到Xcode 6中ViewController的退出项时(不确定这是否是Xcode 6问题,但值得一提,因为它在beta版中),在自定义类中找不到Swift函数

它应该找到的函数:

@IBAction func unwindToList(segue: UIStoryboardSegue) {

}
我在视图上做了另一个按钮,只是为了确保我可以得到一个与Swift一起工作的iAction,并且我写的是正确的。这很好:

@IBAction func test(sender: AnyObject) {

    NSLog("Test")
}
我已经看到这似乎是同一个问题,但根据那里的答案,这应该是有效的


Xcode 6是测试版,当然,Swift是非常新的,但是在考虑它是一个潜在的bug之前,想看看是否有人遇到过这个问题

这是Xcode 6的一个已知问题:

接口生成器无法识别Swift类中声明的展开分段操作

为了避开它,您需要:

  • 类MyViewController
    更改为
    @objc(MyViewController)类MyViewController
  • 为MyViewController创建一个Objective-C头文件,其中包含一个重新声明segue操作的类别

    @interface MyViewController (Workaround)
    - (IBAction)unwindToMyViewController: (UIStoryboardSegue *)segue;
    @end
    
  • 在情节提要中,选择MyViewController的实例,清除其自定义类,然后单击 将其设置回MyViewController

  • 完成这些步骤后,您可以再次将按钮连接到退出项目


    PDF,第10页

    我终于能够让它工作了;Xcode6IB现在非常脆弱(也经常崩溃)。在将导航栏按钮项连接到退出项之前,我必须重新启动IDE。我最终重新创建了我的测试项目,并按照上面的建议(Xcode 6发行说明PDF,第10页)让它工作。此外,在添加.h文件时,我确保选择我的项目目标,默认情况下未选中该目标。我还通过Cocoa Touch类模板(vs空swift文件)创建了我的控制器swift存根。我在导航控制器中使用了一个模态序列

    ListTableViewController.h

    #import <UIKit/UIKit.h>
    
    @interface ListTableViewController
    - (IBAction)unwindToList: (UIStoryboardSegue *)segue;
    @end
    

    希望这有助于

    使用Objective-C解决方案,现在可以安装的Xcode 6 Beta 4支持在Interface Builder中连接展开段。现在可以从iOS开发中心进行更新。控件单击并从要触发segue的UI项拖动到退出图标,并在将以下代码放入目标视图控制器后选择函数unwindToSegue

    @IBAction func unwindToSegue (segue : UIStoryboardSegue) {}
    

    在可供下载的Xcode 6 Beta 4中,支持展开segues和interface builder。我自己在一个小项目中测试了它。

    我也遇到了同样的问题,在开始时Xcode Beta 4也是如此。。直到我发现,我只是忘了在相应的控制器中为Cancel和Save按钮添加@IBOutlet。之后,我可以用退出图标连接按钮:)

    看来Xcode 6.1已经解决了这个问题。现在,您可以使用以下代码在Swift中设置展开分段:

    @IBAction func unwindToList(segue: UIStoryboardSegue) {
        // Nothing needed here, maybe a log statement
        // print("\(segue)")
    }
    
    此方法(可以保持为空)需要具有UIStoryboardSegue类型的方法签名,并且任何对象或接口生成器都不会看到它


    有关更多详细信息,请检查

    ,如果它始终是您希望释放到的同一演示视图控制器,则您可以始终执行以下操作:

    self.navigationController?.popViewControllerAnimated(true)
    

    上面的答案依赖于ObjC来解决这个问题,我已经找到了一个纯粹的快速解决方案。虽然在Swift中添加segue处理程序使我能够在Interface Builder(Xcode 6.3)中创建展开segue,但没有调用该处理程序

    @IBAction func unwindToParent(sender: UIStoryboardSegue) {
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    因此,在深入挖掘之后,
    可以执行来自超类的WindSegueAction:fromViewController:withSender
    返回
    false
    。因此,我已经覆盖了实现,它可以工作:

    override func canPerformUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject) -> Bool {
        return action == Selector("unwindToParent:")
    }
    
    更新
    上面的代码不正确,因为我解决了问题,没有覆盖
    canPerformUnwindSegueAction:fromViewController:withSender
    。基本错误是区分显示的viewcontroller和显示的viewcontroller

    启动展开序列时,它必须首先在导航层次结构中找到最近的视图控制器,该视图控制器执行创建展开序列时指定的展开操作。此视图控制器成为展开序列的目标。如果未找到合适的视图控制器,则将中止展开过程。
    资料来源:


    因此,在显示视图控制器上定义
    @IBAction
    ,而不是在显示视图控制器上。这样,segue也将为属性
    destinationViewController
    sourceViewController
    提供有意义的值,分别是演示和演示的viewcontroller。

    您可能需要验证您尝试展开到的原始控制器目标是否未嵌入到容器对象中。Xcode 6没有这个功能

    Xcode——版本6.4 Swift 1.2

    @iAction func backButton(发送方:AnyObject){ dismissViewControllerAnimated(真,完成:无)
    }

    在Swift 2.3中,我发现参数的外部名称必须是“withUnwindSegue”:


    请查看Xcode发行说明。@JackLawrence谢谢Jack。里面有一张关于这件事的便条,我能弄明白。我会在这里更新这个答案。听起来你也在用swift学习苹果的ToDo应用程序教程。这里有一个有效的swift版本,以防你被卡住:@SimpleAsCouldBe谢谢,是的,我是。我来看看你的回购协议。你好!每个人我使用的是Xcode 6.3,我遇到了上面提到的相同问题。但对我来说,出口可以识别视图控制器中的iAction,而不是我的ViewController.swift,即如果在其他视图控制器中写入iAction函数,则会显示在出口中,而不是在ViewController.swift中写入的。任何帮助都将不胜感激,谢谢!你是对的,文档确实说这是解决这个问题的方法,但我不能确定
    override func canPerformUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject) -> Bool {
        return action == Selector("unwindToParent:")
    }
    
    @IBAction func unwindToThisView(withUnwindSegue unwindSegue: UIStoryboardSegue) {
        ...
    }