2017-05-04 18 views
-1

UIPageViewControllerのデータをViewControllersの1つに渡したいとします。 は、私は、プロトコルがそうのように設定している:準拠した子ViewControllerデリゲートを使用してUIPageViewControllerから子ViewControllerにデータを渡す方法

class PageVC : UIPageViewController{ 
    var delegate : Delegate? 
    var count : Int = 1 

    func classMethod(){ 
     self.displayPageForIndex(5) //this controlls the tranistion to the child ViewController 
     self.delegate?.protocolMethod(count : self.count) 
    } 
} 

protocol Delegate : class{ 
    func protocolMethod(count:Int) 
} 

そしてUIPageViewControllerに、私はviewDidLoadに何をやったか

class ChildVC : UIViewController , Delegate{ 

    func protocolMethod(count : Int){ 
     print(count) 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     let pvc = PageVC() 
     pvc.delegate = self 
    } 
} 

は、ほとんどです私が試した単純化された解決策ですが、まだ答えを見つけることができませんでしたPageViewControllerViewControllerはプロトコルメソッドの受信者です。 誰かがprepareForSegueを使わずに達成するのを手伝ってもらえれば(それはセグがないので)、非常に感謝しています。

+0

あなたの 'ChildVC'と' PageVC'はどこでインスタンス化されていますか?また、デリゲートの名前を指定することをお勧めします。 – toddg

+0

私は、子VCをインスタンス化し、次にそれらを配列に追加する関数を持っています。 PageVC自体はインスタンス化されていません(もちろん、PageViewControllerの機能は完全に機能しますので、子VCSとは異なる方法でインスタンス化されます)。ここでの名前は、私には何をすべきかというアイデアを得るための場所保持者です。私は実際のコードで特定の名前を使用します@toddg –

+0

「PageVC自体はインスタンス化されていません」明らかに、クラスとインスタンスiOS/Cocoaプログラミングでのインスタンスの作成方法基本的なことは何もありません。オブジェクトについて知っていない限り、オブジェクト指向プログラミングを行うことはできません。 – matt

答えて

0

子ビューコントローラが常にUIPageViewControllerのコンテキスト内にあることがわかっている場合は、ビューコントローラの親/子リンクを使用して、コントローラが互いを検出してデータを交換できるようにすることができます。そのような状況で特に便利なのは、クラス参照のセクションのメソッドです。

プロトコルを使用する場合は、ページビューコントローラでプロトコルを定義し、そのプロトコルを作成時に子ビューコントローラに渡します。だから、「

あなたは用語に注意してくださいしたいと思う。そして、

protocol MyDataSourceProtocol { 
    func gimmeSomeData() -> Data 
} 

// The UIPageViewController implements MyDataSourceProtocol because 
// he's going to provide information to his children. 
class PageVC : UIPageViewController, MyDataSourceProtocol { 
    func gimmeSomeData() -> Data { 
     ... 
    } 

    func makeChildViewControllers() -> ChildViewControllers { 
     return childControllerElements.map { 
     element : ChildControllerElement in 

     // pass self to let the child view controller know I'll be his 
     // source 
     return ChildViewController(self) 
     } 
    } 
} 

そして、あなたの子ビューコントローラが知っていることを確認してくださいは、原料

class ChildViewController : UIViewController { 
    let dataSource : MyDataSourceProtocol 
    init(dataSource : MyDataSourceProtocol) { 
    self.dataSource = dataSource 
    } 
} 

が最後にスタイル上のいくつかのコメントを取得していましたCocoa APIのコンテキストでは非常に具体的な意味を持ち、ここでの使用はその意味には一致しません。また、小文字(childVC)のクラスに名前を付けることは、貧弱なスタイルです。

let pvc = PageVC() 

新しい、別の PageVCを行います

1

問題は、このラインです。それはあなたが望むものではありません。 への参照が必要です。実際は PageVCの親です。その参照はself.parentです(ただし、おそらく、viewDidLoadにあります。これはかなり早い時期であり、私たちがまだ子供であることを保証するものではありません)。

関連する問題