2017-02-18 12 views
1

私はこれに対する答えを見つけるのが最も困難な時です。スウィフトでxibビューからストーリーボードviewcontrollerに繋ぐ方法3

私はビューコントローラ内のスクロールビュー内にあるxibビューを持っています。 xibにはアクションがあるボタンがあり、私はストーリーボードにあるビューコントローラーにセグをする必要があります。私はカスタムセグを使うこともできるようにしたいと思っています。

これまでのところ、私はストーリーボードからViewControllerをインスタンス化して、それにセグをすることができます。しかし、私はそのコントローラーを提示する方法を知らない。任意の助け

おかげで...

UPDATE:

これは私がセグエを実行するために使用しているコードです。親のViewControllerで

static var referenceVC: UIViewController? 


override func viewDidLoad() { 
    super.viewDidLoad() 
    print("viewdidload") 
    LevelSelectViewController.referenceVC = self 

    setupScrollView() 
} 

コードXIBビューファイルで

 let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "sightWordController") 

     let parent = LevelSelectViewController.referenceVC! 

     let segue = InFromRightCustomSegue(identifier: "test", source: parent, destination: vc) 


     segue.perform() 
+1

小文字は通常、ストーリーボードの使用のみに限定されています。おそらく、あなたはビューを追加しなければならないでしょう(それは、あなたがペン先からロードするためにビューのクラス全体を何らかの方法でストーリーボードに設定することができます)。さもなければ、それは理由のために 'UIStoryboardSegue'sと呼ばれます。 – TheCodingArt

+0

コードで割り当てることができるカスタムセグを使用する場合は、私が信じて実行するVCが必要です。つまり、レスポンダチェーンを上って、それを実行する関連VCを見つけることができます。一般的には、カスタムトランジションとデリゲートコールバックのようなものが必要です。コードを複雑にしてセグを維持する理由はまったくありません。 – TheCodingArt

+0

私はちょうどそれを働かせました。私の最大の問題は、私はsegueを呼び出すことができるように、親viewcontrollerへの参照を取得していた。私がリファレンスを取得する方法はちょっとしたハックですが、xibファイル内で使用できる親ビューコントローラで静的リファレンス変数を作成しました。参照を取得するより良い方法はありますか?私は自分のコードを表示するために質問を更新します。 – Discoveringmypath

答えて

3

コメント欄で述べたように、Seguesは、典型的documentationに述べたように使用量をストーリーボードに限定されます。あなたは@IBDesignableのような方法でストーリーボードにカスタムxibビューを実装し、xibからストーリーボードファイル/クラスへのビューの読み込みを行うことができます。この方法で、あなたは両方の世界の利益を得ることができます。それ以外の場合は、別の方法(例えば、delegates/target-actionイベントなど)でこれにアプローチすることができます。

responder chainを登って、VCへの参照を取得してセグを呼び出すことによって、ストーリーボードから読み込まれたVCに関連するセグを呼び出すこともできます(セグは特定のアクションに必ずしも付く必要はありません)。以下のサンプルコードのようなレスポンダチェーンを登ることができます:

protocol ChildViewControllerContainer { 
    var parentViewController: UIViewController? { get } 
} 


protocol ViewControllerTraversable { 
    func viewController<T: UIViewController>() -> T? 
} 

extension UIView: ViewControllerTraversable { 

    func viewController<T: UIViewController>() -> T? { 
     var responder = next 

     while let currentResponder = responder { 
      guard responder is T else { 
       responder = currentResponder.next 
       continue 
      } 

      break 
     } 

     return responder as? T 
    } 
} 

extension UITableViewCell: ChildViewControllerContainer { 
    weak var parentViewController: UIViewController? { 
     return viewController() as UIViewController? 
    } 
} 
+0

応答をありがとう、私はこれを調べます。それは間違いなく私の頭を見下ろしている。私がやったやり方に何か問題がありますか?私はそれを動作させるために使用したコードを含めるように私の質問を編集しました – Discoveringmypath

+0

あなたは間違いなくあなたが親VCを参照する方法を静的変数を参照するべきではありません。その問題は上記のコードによって解決されます。 – TheCodingArt

+0

何が起こっているのかを理解しやすくするために、コードにコメントを含めることはできますか? – Discoveringmypath

関連する問題