web-dev-qa-db-ja.com

Xcode 6ストーリーボードでSwift Exitに接続しないでセグエをほどく

ナビゲーションバーボタンを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")
}

この質問 を見たことがありますが、同じ問題のように見えますが、答えによれば、これは機能するはずです。

Xcode 6はベータ版であり、もちろんSwiftは非常に新しいものですが、潜在的なバグであると考える前にこれに遭遇したかどうかを確認したかったのです。

51
skabob11

これはXcode 6の既知の問題です。

SwiftクラスはInterface Builderで認識されません

それを回避するには、以下を行う必要があります。

  1. _class MyViewController_を@objc(MyViewController) class MyViewControllerに変更します
  2. セグエアクションを再宣言するMyViewControllerのカテゴリを持つObjective-Cヘッダーファイルを作成します。

    _@interface MyViewController (Workaround)
    - (IBAction)unwindToMyViewController: (UIStoryboardSegue *)segue;
    @end
    _
  3. ストーリーボードで、MyViewControllerのインスタンスを選択し、そのカスタムクラスをクリアしてから、MyViewControllerに戻します。

これらの手順を実行すると、ボタンを終了アイテムに再度接続できます。

Xcode 6リリースノートPDF、ページ10

55
skabob11

Objective-Cの回避策を使用する代わりに、現在インストールできるXcode 6 Beta 4は、Interface Builderでのアンワインドセグエの接続をサポートしています。 iOS Devセンターから今すぐ更新できます。 Controlキーを押しながらクリックしてセグエをトリガーするUI項目から終了アイコンにドラッグし、次のコードを宛先View Controllerに配置した後、関数unwindToSegueを選択します。

@IBAction func unwindToSegue (segue : UIStoryboardSegue) {}
51
trumpeter201

ようやく機能するようになりました。 xcode6 IBは現在非常に脆弱です(多くのクラッシュもします)。ナビゲーションバーボタンアイテムを終了アイテムに接続する前にIDEを再起動する必要がありました。テストプロジェクトを再作成し、上記の提案(Xcode 6リリースノートPDF、さらに、.hファイルを追加するときに、プロジェクトターゲットを選択するようにしましたが、デフォルトではチェックされていませんでした。また、コントローラーSwift=スタブを作成しましたCocoa Touch Classテンプレートを介して(vs empty Swift file)。navコントローラーでモーダルセグエを使用しました。

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");
    }

}

それが役立つことを願って

16
rajeev

ダウンロード可能なXcode 6 Beta 4では、セグエの巻き戻しとインターフェイスビルダーがサポートされています。私はそれを小さなプロジェクトで自分でテストしました。

11
Fred

In Swift 2.3パラメーターの外部名は「withUnwindSegue」である必要があります。

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

Xcode 6.1はこの問題を修正したようです。次のコードを使用して、Swiftでアンワインドセグエを設定できるようになりました。

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

このメソッドは空のままでも構いませんが、UIStoryboardSegueタイプのメソッドシグネチャが必要であり、AnyObjectやInterface Builderには表示されません。

詳細については、 TechNote 2298 を確認してください。

2
Barlow Tucker

常に同じプレゼンテーションビューコントローラーを使用する場合は、次の操作をいつでも実行できます。

self.navigationController?.popViewControllerAnimated(true)
1
bkopp

最初にXcode Beta 4でも同じ問題が発生しました。気付くまで、それぞれのコントローラーの[キャンセル]ボタンと[保存]ボタンに@IBOutletを追加するのを忘れていました。この後、ボタンをExit-Iconに接続できました:))

1
Andreas Meyer

巻き戻そうとしている元のコントローラーの宛先がContainerオブジェクト内に埋め込まれていないことを確認することができます。 Xcode 6にはありません。

1
TMfranken

上記の答えは問題を解決するためにObjCに依存していますが、私は純粋なSwift=ソリューション。Swift Interface Builder(Xcode 6.3)でセグエ、ハンドラーが呼び出されていませんでした。

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

そのため、掘り下げた後、スーパークラスからのcanPerformUnwindSegueAction:fromViewController:withSenderfalseを返します。だから私は実装をオーバーライドしました、そしてそれは動作します:

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

更新
canPerformUnwindSegueAction:fromViewController:withSenderをオーバーライドせずに問題を解決したため、上記のコードは正しくありません。基本的なエラーは、presentingviewcontrollerとpresentedviewcontrollerを区別することでした。

巻き戻しセグエが開始されると、まず、巻き戻しセグエが作成されたときに指定された巻き戻しアクションを実装するナビゲーション階層で最も近いView Controllerを見つける必要があります。このView Controllerは、巻き戻しセグエの宛先になります。適切なView Controllerが見つからない場合、巻き戻しセグエは中止されます。
出典: テクニカルノートTN2298

したがって、@IBActionは、提示されたView Controllerではなく、提示されたViewControllerで定義します。そうすれば、セグエはプロパティdestinationViewControllerおよびsourceViewControllerにも意味のある値を持ち、それぞれ表示および表示されたViewControllerになります。

0
Bouke

Xcode --version 6.4 Swift 1.2

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

0
cam_271