2017-01-08 8 views
0

私のアプリには、UIPageViewControllerによって制御されるジャーナルがあります。ページのビューコントローラは正常に動作しますが、UIPageViewControllerには異常な動作があります。無限スクロールでUIPageViewControllerを作成する

private func journalPage(for date: Date) -> JournalViewController? { 
    // Create a new view controller and pass suitable data. 
    guard let journalPage = storyboard?.instantiateViewController(withIdentifier: JournalViewController.storyboardID) as? JournalViewController else { 
     return nil 
    } 

    journalPage.date = date 
    return journalPage 
} 
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
    guard let yesterday = calendar.date(byAdding: .day, value: -1, to: self.date) else { 
     return nil 
    } 

    self.date = calendar.startOfDay(for: yesterday)   
    return journalPage(for: self.date) 
} 

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

    guard let tomorrow = calendar.date(byAdding: .day, value: 1, to: self.date) else { 
     return nil 
    } 

    self.date = calendar.startOfDay(for: tomorrow) 
    return journalPage(for: self.date) 
} 

私はUIPageViewControllerdateを更新して構成されたジャーナルのページを返す:まず、デリゲートメソッドは、(ページビューコントローラは、それ自身のデリゲートがあります)。問題は、重複したページ(同じ日付のページ)が頻繁にあるか、またはページ/日付がスキップされることです。私はthis質問を見つけましたが、私は何か類似のものを実装する方法を見ていません。

私は以前にUIPageViewControllerで作業していましたが、これを回避するために常にインデックスを使用していましたが、この場合、開始/終了時刻(文字通り)までスクロールすることができるため、

重複したり欠落した日付を避けるために、新しいページが正しいタイミングで確実に作成されるようにするにはどうすればよいですか?

答えて

1

インデックスを使用せずに問題を解決しました(ページのdateプロパティで十分です)。重複を作成したり、ページをスキップすることなく、どちらの方向にも無限にスクロールします。

extension JournalPageViewController: UIPageViewControllerDataSource { 
    /// Creates and returns a JournalViewController if it can be found in the storyboard, 
    /// and sets it's date to `date` 
    private func journalPage(for date: Date) -> JournalViewController? { 
     // Create a new view controller and pass suitable data. 
     guard let journalPage = storyboard?.instantiateViewController(withIdentifier: JournalViewController.storyboardID) as? JournalViewController else { 
      return nil 
     } 

     journalPage.date = date 
     return journalPage 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 
     debugPrint("Before: ", separator: "", terminator: "") 
     let today = (viewController as! JournalViewController).date 
     guard var yesterday = calendar.date(byAdding: .day, value: -1, to: today) else { 
      return nil 
     } 
     yesterday = calendar.startOfDay(for: yesterday) 

     return journalPage(for: yesterday) 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 
     debugPrint("After: ", separator: "", terminator: "") 
     let today = (viewController as! JournalViewController).date 
     guard var tomorrow = calendar.date(byAdding: .day, value: 1, to: today) else { 
      return nil 
     } 
     tomorrow = calendar.startOfDay(for: tomorrow) 

     return journalPage(for: tomorrow) 
    } 
} 

extension JournalPageViewController: UIPageViewControllerDelegate { 
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { 
     self.date = (self.viewControllers?.first as! JournalViewController).date 
    } 
} 
0

私はあなたのデータを別の方法でモデル化しなければならないと思うので、あなたのデータで配列を含むモデルを作成し、インデックスを使用してコントローラを満たすdatoにアクセスします。このようにして、データに一意にアクセスします。

アップルサンプルから始まるPageControllerベースのアプリでこれを行いました。

Iクラスを持っている:(..比較するリンゴテンプレートを参照)

クラスModelController:NSObjectの、UIPageViewControllerDataSource {

var myPages : [Page]? 

.. }ページ記述クラスである

あなたは1ページ。 私は、このようにリンゴのコードを変更:

func viewControllerAtIndex(_ index: Int) -> BaseHWTestController? { 
    // Return the data view controller for the given index. 

    let count = selected.count 
    if (count == 0) || (index >= count) { 
     return nil 
    } 

    // Create a new view controller and pass suitable data. 

    let myController = storyboard.instantiateViewController(withIdentifier: identifier) as! CustomPageController 
    // set ref. to data inside the controller: 
    BaseHWTestController.dataObject = myPages[index] 
    return BaseHWTestController 
} 
0

あなたは、インデックス番号としてJuilan日番号(JDN)を使用することができませんでしたか?

+0

私はこのアイデアが好きですが、他のカレンダーシステムを使用している場合はこれが壊れますか? – jjatie

+0

iOSを使用すると、カレンダー間で簡単に変換できるため、インデックスにJuilanの日付を使用し、その日付をユーザーのカレンダーにマッピングして表示することができます。 –

関連する問題