Retired Document
Important: This document may not represent best practices for current development. Links to downloads and other resources may no longer be valid.
PhotoMap/PhotosViewController/ModelController.m
/* |
Copyright (C) 2018 Apple Inc. All Rights Reserved. |
See LICENSE.txt for this sample’s licensing information |
Abstract: |
The model or data source for PhotosViewController. |
*/ |
#import "ModelController.h" |
#import "DataViewController.h" |
#import "PhotosViewController.h" |
/* |
A controller object that manages a simple model -- a collection of map annotations |
The controller serves as the data source for the page view controller; it therefore implements pageViewController:viewControllerBeforeViewController: and pageViewController:viewControllerAfterViewController:. |
It also implements a custom method, viewControllerAtIndex: which is useful in the implementation of the data source methods, and in the initial configuration of the application. |
There is no need to actually create view controllers for each page in advance -- indeed doing so incurs unnecessary overhead. Given the data model, these methods create, configure, and return a new view controller on demand. |
*/ |
@implementation ModelController |
- (id)init { |
self = [super init]; |
if (self != nil) { |
_currentPageIndex = 0; |
} |
return self; |
} |
- (DataViewController *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard { |
// return the data view controller for the given index |
if (([self.pageData count] == 0) || (index >= [self.pageData count])) { |
return nil; |
} |
// vreate a new view controller and pass suitable data |
DataViewController *dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"DataViewController"]; |
dataViewController.dataObject = self.pageData[index]; |
return dataViewController; |
} |
- (NSUInteger)indexOfViewController:(DataViewController *)viewController { |
// Return the index of the given data view controller. |
// For simplicity, this implementation uses a static array of model objects and the |
// view controller stores the model object; you can therefore use the model object to identify the index. |
// |
return [self.pageData indexOfObject:viewController.dataObject]; |
} |
#pragma mark - UIPageViewControllerDataSource |
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { |
PhotosViewController *photosViewController = (PhotosViewController *)pageViewController.delegate; |
if (photosViewController.pageAnimationFinished == NO) { |
// we are still animating don't return a previous view controller too soon |
return nil; |
} |
NSUInteger index = [self indexOfViewController:(DataViewController *)viewController]; |
if (index == 0 || index == NSNotFound) { |
// we are at the first page, don't go back any further |
return nil; |
} |
index--; |
_currentPageIndex = index; |
return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; |
} |
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { |
PhotosViewController *photosViewController = (PhotosViewController *)pageViewController.delegate; |
if (photosViewController.pageAnimationFinished == NO) { |
// we are still animating don't return a next view controller too soon |
return nil; |
} |
NSUInteger index = [self indexOfViewController:(DataViewController *)viewController]; |
if (index == NSNotFound) { |
// we are at the last page, don't go back any further |
return nil; |
} |
index++; |
_currentPageIndex = index; |
if (index == [self.pageData count]) { |
return nil; |
} |
return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; |
} |
@end |
Copyright © 2018 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2018-04-26