Xcode 6故事板解开棘手与斯威夫特不连接退出

当试图将一个导航栏button连接到Xcode 6中的一个ViewController的Exit项时(不太确定它是否是Xcode 6的问题,但值得一提的是它在beta中),它在自定义类中找不到Swift函数。

按钮用鞭子退出

它应该发现的function:

@IBAction func unwindToList(segue: UIStoryboardSegue) { } 

我在视图上做了另一个button,以确保我能得到一个IBAction与斯威夫特工作,我正确地写它。 这工作正常:

 @IBAction func test(sender: AnyObject) { NSLog("Test") } 

我看到这个问题似乎是一样的问题,但根据答案,这应该是工作。

Xcode 6处于testing阶段,当然,Swift是非常新的,但是想要看看有没有人遇到过这个问题,然后再考虑一个潜在的bug。

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

在Swift类中声明的展开segue操作不被Interface Builder识别

为了解决它,你需要:

  1. class MyViewController更改为@objc(MyViewController) class MyViewController
  2. 使用MyViewController的类别创build一个Objective-C头文件,以重新声明segue动作。

     @interface MyViewController (Workaround) - (IBAction)unwindToMyViewController: (UIStoryboardSegue *)segue; @end 
  3. 在故事板中,selectMyViewController的实例,清除它的自定义类,然后将其设置回MyViewController。

完成这些步骤之后,您可以再次将button连接到退出项目。

Xcode 6发行说明 PDF,第10页

现在可以安装Xcode 6 Beta 4,而不是使用Objective-C解决方法,它支持Interface Builder中unwind segues的连接。 您现在可以从iOS开发人员中心进行更新。 按住Control键并点击并拖动您要触发Segue的UI项目到退出图标,并在将以下代码放入目标视图控制器后select函数unwindToSegue。

 @IBAction func unwindToSegue (segue : UIStoryboardSegue) {} 

我终于能够开始工作了; xcode6 IB现在真的很脆弱(崩溃了很多)。 在将导航栏button项目连接到退出项目之前,必须重新启动IDE。 我最终重新创build了我的testing项目,并按照上面的build议(Xcode 6发行说明PDF,第10页)使其工作。 另外,在添加.h文件时,我确定select了我的项目目标,默认情况下它是未选中的。 我也通过Cocoa Touch Class模板(vs空swift文件)创build了我的控制器swift stub。 我在我的导航控制器中使用了模态。

ListTableViewController.h

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

ListTableViewController.swift

 import UIKit @objc(ListTableViewController) class ListTableViewController: UITableViewController { @IBAction func unwindToList(s:UIStoryboardSegue) { println("hello world"); } } 

希望有所帮助

在可供下载的Xcode 6 Beta 4中,支持unwind segues和interface builder。 我已经在一个小小的项目中对自己进行了testing。

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

 @IBAction func unwindToThisView(withUnwindSegue unwindSegue: UIStoryboardSegue) { ... } 

看来Xcode 6.1已经解决了这个问题。 你现在可以使用下面的代码在Swift中设置展开顺序:

 @IBAction func unwindToList(segue: UIStoryboardSegue) { // Nothing needed here, maybe a log statement // print("\(segue)") } 

这个方法 – 可以保持为空 – 需要有UIStoryboardSeguetypes的方法签名,而不是AnyObject或Interface Builder不会看到它。

有关更多详细信息,请查阅TechNote 2298

我也有同样的问题,在Xcode Beta 4的开始。直到我发现,我忘了添加@IBOutlet取消和保存button在各自的控制器。 在此之后,我可以连接button与退出图标:))

如果它始终是您想放松的视图控制器,那么您总是可以这样做:

 self.navigationController?.popViewControllerAnimated(true) 

您可能需要validation您试图放到的原始控制器目标未embedded到Container对象中。 Xcode 6没有这个。

上面的答案依靠ObjC来解决这个问题,我find了一个纯粹的Swift解决scheme。 虽然在Swift中添加segue处理程序允许我在Interface Builder(Xcode 6.3)中创buildunwind segue,但是处理程序没有被调用。

 @IBAction func unwindToParent(sender: UIStoryboardSegue) { dismissViewControllerAnimated(true, completion: nil) } 

所以在挖掘之后,超类的canPerformUnwindSegueAction:fromViewController:withSender将返回false 。 所以我已经覆盖了实现,它的工作原理:

 override func canPerformUnwindSegueAction(action: Selector, fromViewController: UIViewController, withSender sender: AnyObject) -> Bool { return action == Selector("unwindToParent:") } 

更新
上面的代码是不正确的,因为我解决了问题,而不重写canPerformUnwindSegueAction:fromViewController:withSender 。 根本的错误是区分呈现的视图控制器和呈现的视图控制器。

当一个展开顺序被启动时,它必须首先在导航层次结构中find最近的视图控制器,这个视图控制器实现了展开顺序创build时指定的展开操作。 此视图控制器成为展开顺序的目的地。 如果没有find合适的视图控制器,放开的继续被中止。
来源: 技术说明TN2298

因此,在呈现视图控制器上定义@IBAction ,而不是在呈现的视图控制器上。 这样,segue将为属性destinationViewControllersourceViewController提供有意义的值,分别是呈现和呈现的viewcontroller。

Xcode – 版本6.4 Swift 1.2

@IBAction func backButton(sender:AnyObject){dismissViewControllerAnimated(true,completion:nil)}