2016-12-23 5 views
0

viewControllerがあり、データが入っています。左または右にスワイプした後、同じUIを持ちながら異なるデータを持つ新しいビューコントローラーを作成します。これを行う最善の方法は何ですか? UIPageViewControllerを使用する必要がありますか?新しいデータでプログラムで左にスワイプしてViewControllerを作成する

+0

正確には、「UIPageViewController」はあなたの問題を解決するのに最適な方法です。 – dirtydanee

+0

しかし、ストーリーボードを使用してUIPageViewControllerに与えられたすべての例は、すべてのviewControllerを手動で与えています。 –

+0

あなたはどこからでもデータをダウンロードしていますか?スワイプで? – dirtydanee

答えて

1

スウィフト3の解決策は、プログラムでUIPageViewControllerを設定することです。

あなたのUIPageViewControllerpagesと呼ばれるlazy arrayと宣言するのが賢明です。

arrayを使用してviewDidLoadを使用すると、viewControllerを設定できます。また、dataSourceは、この配列で動作し、viewControllersを変更するロジックを処理できます。現在、dataSourceはカルーセルのようにviewControllerを連続的に表示するように実装されています。 )あなたのニーズに合わせて変更してください;

import Foundation 
import UIKit 

struct DisplayableData { 
    let title: String 
    let description: String 
    // etc... 
} 

class DataViewController: UIViewController { 
    var data: DisplayableData? 
    // You can add data as an initalizer parameter, depending on your design needs 
    init() { 
     // If you would create a xib for your DataViewController, than replace nib name with DataViewController to make it work 
     super.init(nibName: nil, bundle: nil) 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

class PageViewController: UIPageViewController { 

    lazy internal var pages: [DataViewController] = { 
     // If the UI is the same, reuse the viewController, no need to create multiple ones 
     // You could create a xib, and draw the UI there 
     let firstVC = DataViewController() 
     // Assign your data structure to your viewController 
     firstVC.data = DisplayableData(title: "first", description: "desc") 

     let secondVC = DataViewController() 
     secondVC.data = DisplayableData(title: "second", description: "desc") 

     let thirdVC = DataViewController() 
     thirdVC.data = DisplayableData(title: "third", description: "desc") 

     return [firstVC, secondVC, thirdVC] 
    }() 


    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.dataSource = self 
     // Set your viewControllers 
     setViewControllers([pages.first!], direction: .forward, animated: false, completion: nil) 
    } 
} 

extension PageViewController: UIPageViewControllerDataSource { 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

     // Lets check if the viewController is the right type 
     guard let viewController = viewController as? DataViewController else { 
      fatalError("Invalid viewController type in PageViewController") 
     } 

     // Load the next one, if it is the last, load the first one 
     let presentedVCIndex: Int! = pages.index(of: viewController) 
     if presentedVCIndex + 1 > pages.count - 1 { 
      return pages.first 
     } 
     return pages[presentedVCIndex + 1] 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 

     // Lets check if the viewController is the right type 
     guard let viewController = viewController as? DataViewController else { 
      fatalError("Invalid viewController type in PageViewController") 
     } 

     // Load the previous one, if it is the first, load the last one 
     let presentedVCIndex: Int! = pages.index(of: viewController) 
     if presentedVCIndex - 1 < 0 { 
      return pages.last 
     } 

     return pages[presentedVCIndex - 1] 

    } 

    func presentationCount(for pageViewController: UIPageViewController) -> Int { 
     return pages.count 
    } 
} 
+0

ありがとう、それを実装しようとします。メリークリスマス !! –

関連する問題