Xcode 6 Storyboard Unwind Segue与Swift没有连接到退出

时间:2014-06-04 05:19:59

标签: ios swift xcode uibarbuttonitem

当尝试将导航栏按钮连接到Xcode 6中的ViewController的Exit项目时(不确定它是否是Xcode 6问题但值得一提,因为它处于测试阶段)它没有找到Swift自定义类中的函数。

Button to Exit with whip

它应该找到的功能:

@IBAction func unwindToList(segue: UIStoryboardSegue) {

}

我在视图上创建了另一个按钮,以确保我可以使用Swift处理IBAction并且我正确地编写了它。这很好用:

@IBAction func test(sender: AnyObject) {

    NSLog("Test")
}

我看到this question似乎是同一个问题,但根据答案,这应该有效。

Xcode 6处于测试阶段,当然,Swift非常新,但是想看看是否有人在考虑它之前遇到了这个问题。

11 个答案:

答案 0 :(得分:55)

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

  

Interface Builder

无法识别在Swift类中声明的展开segue操作

为了解决这个问题,您需要:

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

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

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

    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也将为属性destinationViewControllersourceViewController提供有意义的值,分别是呈现和呈现的视图控制器。

答案 10 :(得分:0)

Xcode --version 6.4 Swift 1.2

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