2017-02-24 21 views
0

ユーザーに「スワイプ」させるために2つの「子」ViewControllerをロードするPageViewControllerがあります。私はこのスワイプのジェスチャーを望んでいませんが、私はViewViewControllerの中で、PageviewControllerでsetViewControllerを使用できるようにする関数を用意したいと考えています。Swift:他のViewControllerからPageViewControllerの関数を呼び出す

私はプロトコルを使ってみましたが、うまくいきませんでした。

私は本当にそれを達成するための助けや提案を感謝します。ありがとう!

答えて

1

アクセスsetViewControllersへあなたの子ビューコントローラから、あなたの親のPageViewControllerを知るためにあなたの子ビューコントローラが必要になります。これを行うには、プロトコルを作成することから始めます(プロトコルを試したと言いましたが、私の方法を見てください)。このプロトコルは、すべての子ビューコントローラが親PageViewControllerへの参照を持つことを保証する。

protocol PageObservation: class { 
     func getParentPageViewController(parentRef: PageViewController) 
    } 

子ビューコントローラがPageObservation Protocolに準拠していることを確認してください。あなたは各子ビューコントローラを作成すると、あなたのPageViewControllerで

class Child1ViewController: UIViewController, PageObservation { 
     var parentPageViewController: PageViewController! 
     func getParentPageViewController(parentRef: PageViewController) { 
      parentPageViewController = parentRef 
     } 
    } 

    class Child2ViewController: UIViewController, PageObservation { 
     var parentPageViewController: PageViewController! 
     func getParentPageViewController(parentRef: PageViewController) { 
      parentPageViewController = parentRef 
     } 
    } 

、PageObservation型にそれらをキャストし、親PageViewControllerの参照を渡します。私は、orderViewControllersという配列を使ってページを作成しています。私のUIPageViewControllerDataSourceデリゲートメソッドはどのページをロードするかを知るためにこのメソッドを使用していますが、この例とは無関係です。ページを作成する方法が違う場合に備えてお知らせします。

class PageViewController: UIPageViewController { 
     var orderedViewControllers: [UIViewController] = [] 


     //creating child 1 
     //i am using storyboard to create the child view controllers, I have given them the identifiers Child1ViewController and Child2ViewController respectively 
     let child1ViewController = UIStoryboard(name: "Main", bundle: nil) . 
     instantiateViewController(withIdentifier: "Child1ViewController") 
     let child1WithParent = child1ViewController as! PageObservation 
     child1WithParent.getParentPageViewController(parentRef: self) 

     orderedViewControllers.append(child1ViewController) 

     //creating child 2 
     let child2ViewController = UIStoryboard(name: "Main", bundle: nil) . 
     instantiateViewController(withIdentifier: "Child2ViewController") 
     let child2WithParent = child2ViewController as! PageObservation 
     child2WithParent.getParentPageViewController(parentRef: self) 

     orderedViewControllers.append(child2ViewController) 
    } 

子ビューコントローラ内で、setViewControllerにアクセスできます。他の回答は、上記の言ったこと、あなたができるにもかかわらず、サイドノートでは

class Child1ViewController: UIViewController, PageObservation { 
     var parentPageViewController: PageViewController! 
     func getParentPageViewController(parentRef: PageViewController) { 
      parentPageViewController = parentRef 
     } 

     func accessSetViewControllers() { 
      parentPageViewController.setViewControllers(//do what you need) 
     } 
    } 

、:私はchild1ViewControllerでsetViewControllersを呼び出したい場合たとえば、私はsetViewControllersにアクセスFUNCと呼ばれるaccessSetViewControllersを()作成しましたdataSourceを好きなものに設定します。私はときどき何かをする前に画面からスワイプしないようにdataSourceをnilに設定し、その後dataSourceを追加してスワイプを継続できるようにします。

+0

あなたの答えをありがとう。しかし、あなたのコードでは "pageViewController"とは何ですか?子コントローラを作成する際に使用しています。 –

+0

それは間違いでした、申し訳ありません。私は今それを修正しました。 – gwinyai

+0

私はあなたのソリューションを試して、すべてがうまくいくようです!はるかに最良の答えはオンラインで見つけた! しかしもう1つ質問があります: 私は3つのチャイルドビューコントローラを持ち、それぞれが独自のナビゲーションコントローラに埋め込まれているとしましょう。私はどのように "子コントローラを作成する"?ナビゲーションコントローラ - ストーリーボード - IDでそれらを参照するだけでは機能しませんでした。私は他の何かを変えなければなりませんか? よろしくお願いいたします。ありがとうございました! –

0

dataSourceを設定しないでください。それが無ければ、ジェスチャーは動作しません。

https://developer.apple.com/reference/uikit/uipageviewcontroller

ページビュー・コントローラ・インタフェースを定義するときは、コンテンツビューコントローラを一度に1つ(または2時間で、背骨の位置と、両面の状態に応じて)やなどを提供することができますデータソースを使用する必要があります。一度に1つずつコンテンツビューコントローラを提供する場合は、setViewControllers(_:direction:animated:completion:)メソッドを使用して、現在のコンテンツビューコントローラを設定します。 ジェスチャベースのナビゲーションをサポートするには、データソースオブジェクトを使用してView Controllerを提供する必要があります。

+0

ええ、私はそれについて読んでいます。問題は、私の子ViewControllerから "setViewControllers"を呼び出す方法がわからないことです。 返信ありがとう –

+0

'goBack' /' goForward'のようなメソッドでデリゲートプロトコルを作成し、子VCにデリゲートの弱いプロパティを追加する方が良いでしょう。その後、親VCを子VCに代理人にします。この場合、子から直接 'setViewControllers'を呼び出す必要はありません。ページVC – Dmitry

+0

については何も知らないでしょう!多分それはうまくいくでしょう、そうするなら、あなたは本当に人生の安全です! –

0

単純化したアプローチ... pageViewControllerののviewDidLoadに作り付けのジェスチャー認識器を取り外し:

for view in self.pageViewController!.view.subviews { 
    if let subView = view as? UIScrollView { 
     subView.scrollEnabled = false 
    } 
} 

は、その下に、独自のジェスチャーを追加します。私は、現時点ではダブルタップで作業することが起こっていますが、それは左にスワイプさせることができ、十分な権利簡単にスワイプ:

あなたのコードで
let doubleTap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(didDoubleTap)) 
doubleTap.numberOfTapsRequired = 2 
doubleTap.delaysTouchesBegan = true 
self.addGestureRecognizer(doubleTap) 

とジェスチャー機能:

func didDoubleTap(gesture: UITapGestureRecognizer) { 

//... stuff 

} 
関連する問題