当尝试将导航栏按钮连接到Xcode 6中的ViewController的Exit项目时(不确定它是否是Xcode 6问题但值得一提,因为它处于测试阶段)它没有找到Swift自定义类中的函数。
它应该找到的功能:
@IBAction func unwindToList(segue: UIStoryboardSegue) {
}
我在视图上创建了另一个按钮,以确保我可以使用Swift处理IBAction并且我正确地编写了它。这很好用:
@IBAction func test(sender: AnyObject) {
NSLog("Test")
}
我看到this question似乎是同一个问题,但根据答案,这应该有效。
Xcode 6处于测试阶段,当然,Swift非常新,但是想看看是否有人在考虑它之前遇到了这个问题。
答案 0 :(得分:55)
这是Xcode 6的一个已知问题:
Interface Builder
无法识别在Swift类中声明的展开segue操作
为了解决这个问题,您需要:
class MyViewController
更改为@objc(MyViewController) class MyViewController
创建一个Objective-C头文件,其中包含重新声明segue操作的MyViewController类别。
@interface MyViewController (Workaround)
- (IBAction)unwindToMyViewController: (UIStoryboardSegue *)segue;
@end
在故事板中,选择MyViewController的实例,然后清除其自定义类 将其设置回MyViewController。
完成这些步骤后,您可以再次将按钮连接到退出项目。
Xcode 6 Release Notes PDF,第10页
答案 1 :(得分:51)
现在可以安装的Xcode 6 Beta 4不支持使用Objective-C解决方法,而是支持在Interface Builder中连接展开segue。您现在可以从iOS开发中心进行更新。按住Control键并从要触发segue的UI项目拖动到退出图标,并在将以下代码放入目标视图控制器后选择函数unwindToSegue。
@IBAction func unwindToSegue (segue : UIStoryboardSegue) {}
答案 2 :(得分:16)
我终于可以上班了; xcode6 IB现在非常脆弱(崩溃了很多)。在将导航栏按钮项目连接到退出项目之前,我必须重新启动IDE。我最终重新创建了我的测试项目并遵循上述建议(Xcode 6发行说明PDF,第10页)以使其工作。另外,在添加.h文件时,我确保选择我的项目目标,默认情况下未选中。我还通过Cocoa Touch Class模板(vs empty swift文件)创建了我的控制器swift存根。我在导航控制器中使用了模态segue。
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");
}
}
希望有所帮助
答案 3 :(得分:11)
在可供下载的Xcode 6 Beta 4中,支持展开segues和界面构建器。我在一个小项目中亲自测试过。
答案 4 :(得分:5)
在Swift 2.3中,我发现参数的外部名称必须是“withUnwindSegue”:
O(n*m*k)
答案 5 :(得分:2)
Xcode 6.1似乎解决了这个问题。您现在可以使用以下代码在Swift中设置展开segue:
@IBAction func unwindToList(segue: UIStoryboardSegue) {
// Nothing needed here, maybe a log statement
// print("\(segue)")
}
此方法 - 可以保持为空 - 需要具有UIStoryboardSegue类型的方法签名,而不是AnyObject或Interface Builder不会看到它。
有关详细信息,请查看TechNote 2298
答案 6 :(得分:1)
我遇到了同样的问题,一开始也使用Xcode Beta 4.直到我发现,我只是忘了在相应的控制器中为取消和保存按钮添加@IBOutlet。在此之后,我可以使用Exit-Icon连接按钮:))
答案 7 :(得分:1)
如果它总是与你要放松的呈现视图控制器相同,你可以随时做:
self.navigationController?.popViewControllerAnimated(true)
答案 8 :(得分:1)
您可能需要验证您尝试展开的原始控制器目标是否未嵌入到Container对象中。 Xcode 6没有那个。
答案 9 :(得分:0)
上面的答案依靠ObjC解决问题,我找到了一个纯粹的Swift解决方案。虽然在Swift中添加segue处理程序允许我在Interface Builder(Xcode 6.3)中创建展开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
。根本的错误是区分呈现 viewcontroller和呈现的 viewcontroller。
当启动展开segue时,它必须首先在导航层次结构中找到最近的视图控制器,该控制器实现在创建展开segue时指定的展开动作。此视图控制器成为展开segue的目标。如果找不到合适的视图控制器,则取消展开segue 来源:Technical Note TN2298
因此,在呈现的viewcontroller上定义@IBAction
,而不是在呈现的视图控制器上定义。这样,segue也将为属性destinationViewController
和sourceViewController
提供有意义的值,分别是呈现和呈现的视图控制器。
答案 10 :(得分:0)
Xcode --version 6.4 Swift 1.2
@IBAction func backButton(sender:AnyObject){ dismissViewControllerAnimated(true,completion:nil) }