2017-05-14 9 views
1

ViewControllerクラスにはUIScrollViewが含まれていますが、スクロールビューには現在別のビューコントローラがあり、現在ジェスチャ認識を受け取ることができます。私の目標は、subViewControllerをタップして、別のView Controllerにセグを実行できるようにすることです。サブViewControllerからsegueを実行

let scrollView = UIScrollView(frame: CGRect(x:0,y:0, width: self.view.frame.width, height:self.view.frame.height-106)) 
scrollView.delegate = self;  
self.view.addSubview(scrollView); 

let subView11 = subView(nibName: nil, bundle: nil); 
subView1.view.frame = CGRect(x:0,y:0, width: self.view.frame.width, height: CGFloat(openReelHeight)); 
self.addChildViewController(subView1); 
scrollView.addSubview(subView1.view); 
subView.didMove(toParentViewController: self); 

はその後サブビュークラスで私は基本的なタッチ認識機能があります。

@IBAction func tapOnView(_ sender: UITapGestureRecognizer) { 
    //change main View controller 
} 
+1

あなたが試したコードを表示しますか?コメントにコードを投稿するのではなく –

+0

と入力すると、質問を編集する必要があります。 –

+0

ええ、私は、フォーマットがすべてオフであったことを認識しました –

答えて

0

を私は親がセグエを実行させることを示唆しています。したがって、ボタンがタップされたことを子供に親に知らせるための仕組みが必要です。

  1. 子ビュー・コントローラはプロトコルを定義し、その@IBActionボタンのは、親ビューコントローラでそれを呼び出すことができます:ここでは、2つのアプローチがあります。

    protocol ChildViewControllerDelegate { 
        func child(_ child: ChildViewController, didTapButton button: Any) 
    } 
    
    class ChildViewController: UIViewController { 
    
        @IBAction func didTapButton(_ sender: Any) { 
         if let parent = parent as? ChildViewControllerDelegate { 
          parent.child(self, didTapButton: sender) 
         } 
        } 
    
    } 
    

    明らかに、親ビューコントローラは、そのプロトコルに準拠する必要があります。

    extension ViewController: ChildViewControllerDelegate { 
        func child(_ child: ChildViewController, didTapButton button: Any) { 
         // now segue to whatever you want 
        } 
    } 
    
  2. あなたは、代わりというのビューコントローラの包含関係に依存するよりも、明示的なプロトコルデリゲートのパターンに従うことができますparent:親が子を追加したとき

    protocol ChildViewControllerDelegate: class { 
        func didTapButton(_ sender: Any) 
    } 
    
    class ChildViewController: UIViewController { 
    
        weak var delegate: ChildViewControllerDelegate? 
    
        @IBAction func didTapButton(_ sender: Any) { 
         delegate?.didTapButton(sender) 
        } 
    
    } 
    

    そして、それが明示的にを設定する必要があります:

    let child = storyboard!.instantiateViewController(withIdentifier: "ChildViewController") as! ChildViewController 
    addChildViewController(child) 
    child.delegate = self 
    
    // add the child's view to your view hierarchy however appropriate for your app 
    
    child.didMove(toParentViewController: self) 
    

    そして、もちろん、親は再びこのプロトコルに準拠しています

    extension ViewController: ChildViewControllerDelegate { 
        func didTapButton(_ sender: Any) { 
         // segue to next scene 
        } 
    } 
    

注、これらのアプローチの両方で、あなたが含まれるように、あなたのプロトコルのfuncを変更することができますどのようなパラメータ(例えば一部のUITextFieldなどの内容を渡します)。同様に、子の機能意図をもう少し明示的にするメソッド名を使用することもできます。いろいろな子どもたちが何をしているのかわからないので、やや汎用的なメソッドとプロトコル名を使用しました。

+0

ありがとう、これはまさに私が探していたものでしたが、プロトコルが何であるかを正確に説明することができましたか? –

+0

プログラミングの基本原則は、異なるクラスを可能な限り疎結合に保つことです(つまり、特定の親クラスで動作するようにプログラムする必要はありません。親に何らかの変更を加えた場合、 )。プロトコルは実際には、2つの疎結合クラスの間の契約であり、「おい、お子さんは、あなたのプロトコルに準拠している場合は、そのことを知っています。プロトコルで定義したこの1つのメソッドを実装します。 – Rob

+0

Javaの抽象クラスに似ていますか? –

関連する問題