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识别
为了解决它,你需要:
- 将
class MyViewController
更改为@objc(MyViewController) class MyViewController
-
使用MyViewController的类别创build一个Objective-C头文件,以重新声明segue动作。
@interface MyViewController (Workaround) - (IBAction)unwindToMyViewController: (UIStoryboardSegue *)segue; @end
-
在故事板中,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将为属性destinationViewController
和sourceViewController
提供有意义的值,分别是呈现和呈现的viewcontroller。
Xcode – 版本6.4 Swift 1.2
@IBAction func backButton(sender:AnyObject){dismissViewControllerAnimated(true,completion:nil)}