-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRSPageViewControllerDataSource.m
More file actions
160 lines (123 loc) · 4.83 KB
/
RSPageViewControllerDataSource.m
File metadata and controls
160 lines (123 loc) · 4.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
//
// RSPageViewControllerDataSource.m
//
//
// Created by Radoslaw Szeja on 15.06.2014.
//
//
#import "RSPageViewControllerDataSource.h"
@interface RSPageViewControllerDataSource ()
@property (nonatomic, strong) NSArray *controllersIDs;
@property (nonatomic, strong) NSString *storyboardName;
@end
@implementation RSPageViewControllerDataSource
- (instancetype)initWithPageViewController:(UIPageViewController *)pageViewController childControllers:(NSArray *)childControllers
{
self = [super init];
if (self) {
_pageViewController = pageViewController;
_childControllers = childControllers;
[self configureWithInitialControllers:@[self.childControllers.firstObject]];
}
return self;
}
#pragma mark - UIPageViewControllerDataSource
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSInteger pageIndex = [self.childControllers indexOfObject:viewController];
if (NSNotFound == pageIndex) {
return nil;
}
if (++pageIndex == self.childControllers.count) {
return nil;
}
return [self.childControllers objectAtIndex:pageIndex];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSInteger pageIndex = [self.childControllers indexOfObject:viewController];
if (0 == pageIndex || NSNotFound == pageIndex ) {
return nil;
}
return [self.childControllers objectAtIndex:(pageIndex-1)];
}
- (UIViewController *)viewControllerAtIndex:(NSUInteger)index
{
return [self.childControllers objectAtIndex:index];
}
#pragma mark - UIPageViewControllerDelegate
- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed
{
if (finished && completed) {
NSInteger index = [self.childControllers indexOfObject:pageViewController.viewControllers.firstObject];
self.pageControl.currentPage = index;
if ([self.pvcDelegate respondsToSelector:@selector(pageViewController:switchedToController:)]) {
[self.pvcDelegate pageViewController:self.pageViewController switchedToController:pageViewController.viewControllers.firstObject];
}
}
}
#pragma mark - Configuration
- (void)configureWithInitialControllers:(NSArray *)controllers
{
if (nil != self.pageViewController &&
nil != controllers &&
[controllers isKindOfClass:[NSArray class]] &&
controllers.count > 0)
{
[self.pageViewController setViewControllers:controllers
direction:UIPageViewControllerNavigationDirectionForward
animated:YES
completion:nil];
}
}
#pragma mark - Setup
- (void)instantiateChildControllers
{
if (self.controllersIDs != nil) {
UIStoryboard *storyboard = nil;
if (self.storyboardName) {
storyboard = [UIStoryboard storyboardWithName:self.storyboardName bundle:nil];
} else {
storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
}
if (storyboard) {
NSMutableArray *mutableChildControllers = [NSMutableArray array];
for (NSString *storyboardID in self.controllersIDs) {
UIViewController *controller = [storyboard instantiateViewControllerWithIdentifier:storyboardID];
[mutableChildControllers addObject:controller];
}
self.childControllers = [mutableChildControllers copy];
}
}
}
#pragma mark - Setters
- (void)setChildControllers:(NSArray *)childControllers
{
_childControllers = childControllers;
}
- (void)setChildControllersFromString:(NSString *)controllers
{
_controllersIDs = [controllers componentsSeparatedByString:@","];
[self instantiateChildControllers];
}
- (void)setStoryboardName:(NSString *)storyboardName
{
_storyboardName = storyboardName;
}
- (void)setPageViewController:(UIPageViewController *)pageViewController
{
if (pageViewController != nil) {
_pageViewController = pageViewController;
NSAssert(self.childControllers.count > 0, @"Child Controllers must be provided before page view controller");
[self configureWithInitialControllers:@[self.childControllers.firstObject]];
}
}
- (void)setPageControl:(UIPageControl *)pageControl
{
_pageControl = pageControl;
NSUInteger childControllersCount = self.childControllers.count;
if (childControllersCount > 0) {
_pageControl.numberOfPages = self.childControllers.count;
}
}
@end