2016-10-30 7 views
2

マイアプリのナビゲーションフローはビット次のようになります。インターフェイスビルダーが私の巻き戻しセグを表示しないのはなぜですか?

UINavigationController - MasterViewController> DetailViewController> InfoViewController

MasterViewControllerには、以下の方法が含まれます。DetailViewControllerで

@IBAction func unwindToMaster(with segue: UIStoryboardSegue) {} 

を、同様の方法があります:

@IBAction func unwindToDetail(with segue: UIStoryboardSegue) {} 

これらのメソッドをUIButtonsと共に使用して、ユーザーがナビゲーション階層を前後に進めることができるようにします。 InfoViewControllerの「Exit」を右クリックすると、Interface Builderでメソッドが表示されますが、DetailViewControllerの「Exit」を右クリックすると、他のunwind seguesは表示されません。

私はインタフェースビルダーで巻き戻しセグを生成する正しい方法を指示する複数のオンラインソース(Ray Wenderlich、関連するStackOverflowの質問)に相談しましたが、これらのどれもが問題の解決に役立っていません。今のところ、の問題はであることがわかりました。開発が進むにつれて、おそらく私は顔を見開いて何かを見つめています。

Exit Menu in DetailViewController — 'unwindToPersonWith:' = 'unwindToDetail'

私はスウィフト3を使用してのXcode 8.1を実行しています、ありがとうございました。

+0

私はそれは、関連するアンワインドseguesのすべてを見つけるために、Xcodeのために、時にはいくつかの再構築を取る見てきました。ストーリーボードを清掃し、再構築してから再度開くと、それはまったく役に立ちますか? –

+0

"with"という単語を削除し、アンダースコア( '_')で置き換えることをお勧めします。それがここに期待されるものです。 – matt

+0

私はあなたの提案を数回、@ChrisVigで試みましたが、ストーリーボードで何も変わっていませんでした。過去に、インタフェースビルダーが追いつくために何回再構築しなければならなかったのですか? – blutie

答えて

6

:だけでなく、ストーリーボードアンワインドセグエのためのアクションがアンワインド-へ(宛先)ビューコントローラ(例えば、@IBAction func prepareForUnwind(segue: UIStoryboardSegue)、用class定義と同じソースファイルに配置する必要があります"Presenting Segues"リスト内のprepareForUnwind[With]Segueとして検出されます)。また、View Controller は、任意のセカンダリソースファイル内に任意の拡張子を持つことはできませんclass定義とすべての拡張機能を1つのソースファイルにマージする必要があります。(Xcodeの8.2.1のよう。)

+0

この情報はありがとうございます。 –

+0

私は夢中になるだろう!どのようなバグ! :( – Gabriele

3

私はアップルのデベロッパーライブラリ(具体的にはページ"Using Unwind Segues")に相談しました。そこでは、アンワインドアクションの定義例は次のとおりです。また、

@IBAction func unwindToMaster(sender: UIStoryboardSegue) { 
    print("Unwinded to master.") 
} 

@IBAction func unwindToDetail(sender: UIStoryboardSegue) { 
    print("Unwinded to detail.") 
} 

私は:

@IBAction func unwindToMainMenu(sender: UIStoryboardSegue) { 
    let sourceViewController = sender.sourceViewController 
    // Pull any data from the view controller which initiated the unwind segue. 
} 

は私のコードでこの例を適用すると、私はに私のアンワインドアクション宣言を変更しました各メソッドがMasterViewControllerのクラス宣言と同じファイルに含まれていることを確認しました。さらにテストしたところ、MasterViewControllerのすべての拡張機能は、同じファイルにが存在していたことがわかりました。は、インターフェイスビルダーが巻き戻しセグを見つけて認識するためのものです。

ここで、ストーリーボードでは、終了メニューで両方の巻き戻しが表示されます。私の結論は、メソッドがどこに置かれ、どのようにそれらが宣言されているのかを調べることによって、インターフェースビルダーが認識できる設定が見つかるということです。私は、現在の方法組織が非常に長く、ナビゲートするのが難しいので、将来的にはそれほど気にならないことを願っています。再反復するために

enter image description here

+0

あなたはそれを解決した偉大な! – matt

+0

私は同じ問題を抱えていました。私のメソッドシグネチャは正しいものの、別のファイルに拡張子がありました。それを同じファイルに戻して固定しました。 – tylernol

0

私の場合、私は私のビューコントローラで複雑な継承を持っていたし、それは、Interface Builderのが私のアンワインドを見ていない理由でした。したがって、この回避策がうまく私の作品:

  1. YouCollViewController.swiftファイルに移動し、すべてのクラス、プロトコル、ジェネリックを削除するなど、あなたのビューコントローラは
  2. UIViewController
  3. 行くから、あなたのビューコントローラを継承ビューコントローラの宣言に実装しますストーリーボードにしてunwindを使用して、アクションを接続する、それが
  4. YouCollViewController.swiftファイルに戻って、すべての変更を破棄巻き戻さリストに表示されます
0

これらの答えのどれも私を助けなかったので、私はそれほど多くのコードを浪費したくありませんでした。ここで別の解決策を試すことができます。

あなたのMasterViewControllerに巻き戻し機能を既に追加した時点から開始します。

  1. まず私は先に行って、私のストーリーボードに新規のViewControllerだけでなく、タイプのUIViewControllerの新しいココアタッチクラスファイルを追加し、私のストーリーボード1(私はHelperViewControllerそれを呼ばれる)と、それに接続されています。

  2. 次に、新しく作成したHelperVCに既にMasterVCが入っている同じ巻き戻し機能を追加できます。

    @IBAction func unwindToMaster(with segue: UIStoryboardSegue) {}

  3. 今すぐあなたのDetailVCにヘルパーを接続します。あなたのストーリーボードは私のように見えるはずです。 Ctrl +ドラッグ&ドロップしてDetailVCを終了すると、私と同じオプションが表示されます。接続が確立され、新しく作成されたセグの上にマウスを置くと、マスターとHelperVCの両方がハイライト表示されます。これで、HelperVCをもう一度削除することができ、すべてが正常に動作するはずです。

私は助けて欲しい!

My Storyboard

関連する問題