From c626fd5944dcc5cbd63ddda006d37ce96e5e1006 Mon Sep 17 00:00:00 2001 From: Christoph Keller Date: Thu, 4 Dec 2014 19:01:07 +0100 Subject: [PATCH] Added pageIndex as additional category item. This obsoletes MSPageViewControllerChild (and MSPageViewControllerPage). Any UIViewController can now be put inside the MSPageViewController without having to subclass or implement any other code. Since these two classes were deleted, this change breaks existing code. --- .../Source/MSPageViewController+Protected.h | 5 +--- .../Source/MSPageViewController.h | 6 ----- .../Source/MSPageViewController.m | 17 ++++++------- .../Source/MSPageViewControllerPage.h | 15 ------------ .../Source/MSPageViewControllerPage.m | 15 ------------ .../UIViewController+MSPageViewController.h | 14 +++++++++++ .../UIViewController+MSPageViewController.m | 24 +++++++++++++++++++ README.md | 1 - 8 files changed, 46 insertions(+), 51 deletions(-) delete mode 100644 MSPageViewController/Source/MSPageViewControllerPage.h delete mode 100644 MSPageViewController/Source/MSPageViewControllerPage.m create mode 100644 MSPageViewController/Source/UIViewController+MSPageViewController.h create mode 100644 MSPageViewController/Source/UIViewController+MSPageViewController.m diff --git a/MSPageViewController/Source/MSPageViewController+Protected.h b/MSPageViewController/Source/MSPageViewController+Protected.h index 4f1e1a4..7fdf1a6 100644 --- a/MSPageViewController/Source/MSPageViewController+Protected.h +++ b/MSPageViewController/Source/MSPageViewController+Protected.h @@ -9,9 +9,6 @@ #import "MSPageViewController.h" /** - * Subclassing notes: - * Child view controllers must conform to `MSPageViewControllerChild`. - * * @see `MSPageViewControllerPage`. */ @interface MSPageViewController () @@ -26,7 +23,7 @@ /** * Can be overriden to perform additional configuration on the controller. */ -- (void)setUpViewController:(UIViewController *)viewController +- (void)setUpViewController:(UIViewController *)viewController atIndex:(NSInteger)index __attribute((objc_requires_super)); /** diff --git a/MSPageViewController/Source/MSPageViewController.h b/MSPageViewController/Source/MSPageViewController.h index 6273bce..e49bba1 100644 --- a/MSPageViewController/Source/MSPageViewController.h +++ b/MSPageViewController/Source/MSPageViewController.h @@ -15,9 +15,3 @@ @interface MSPageViewController : UIPageViewController @end - -@protocol MSPageViewControllerChild - -@property (nonatomic) NSInteger pageIndex; - -@end \ No newline at end of file diff --git a/MSPageViewController/Source/MSPageViewController.m b/MSPageViewController/Source/MSPageViewController.m index 880af8b..3d9ca6a 100644 --- a/MSPageViewController/Source/MSPageViewController.m +++ b/MSPageViewController/Source/MSPageViewController.m @@ -8,6 +8,7 @@ #import "MSPageViewController.h" #import "MSPageViewController+Protected.h" +#import "UIViewController+MSPageViewController.h" @implementation MSPageViewController @@ -47,7 +48,7 @@ - (NSInteger)pageCount { return (NSInteger)self.pageIdentifiers.count; } -- (void)setUpViewController:(UIViewController *)viewController +- (void)setUpViewController:(UIViewController *)viewController atIndex:(NSInteger)index { } @@ -72,34 +73,30 @@ - (void)viewDidLoad { #pragma mark - UIPageViewControllerDataSource - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController - viewControllerBeforeViewController:(UIViewController *)viewController { + viewControllerBeforeViewController:(UIViewController *)viewController { const NSInteger index = viewController.pageIndex; return (index == NSNotFound) ? nil : [self viewControllerAtIndex:index - 1]; } - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController - viewControllerAfterViewController:(UIViewController *)viewController { + viewControllerAfterViewController:(UIViewController *)viewController { const NSInteger index = viewController.pageIndex; return (index == NSNotFound) ? nil : [self viewControllerAtIndex:index + 1]; } - (UIViewController *)viewControllerAtIndex:(NSInteger)index { - UIViewController *result = nil; + UIViewController *result = nil; if (index >= 0 && index < self.pageCount) { NSAssert(self.storyboard, @"This controller is only meant to be used inside of a UIStoryboard"); result = [self.storyboard instantiateViewControllerWithIdentifier:self.pageIdentifiers[(NSUInteger)index]]; - + NSParameterAssert(result); - NSAssert([result conformsToProtocol:@protocol(MSPageViewControllerChild)], - @"Child view controller (%@) must conform to %@", - result, - NSStringFromProtocol(@protocol(MSPageViewControllerChild))); - + result.pageIndex = index; [self setUpViewController:result diff --git a/MSPageViewController/Source/MSPageViewControllerPage.h b/MSPageViewController/Source/MSPageViewControllerPage.h deleted file mode 100644 index 9aa1249..0000000 --- a/MSPageViewController/Source/MSPageViewControllerPage.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// MSPageViewControllerPage.h -// MSPageViewController -// -// Created by Nacho Soto on 2/16/14. -// Copyright (c) 2014 MindSnacks. All rights reserved. -// - -#import - -#import "MSPageViewController.h" - -@interface MSPageViewControllerPage : UIViewController - -@end diff --git a/MSPageViewController/Source/MSPageViewControllerPage.m b/MSPageViewController/Source/MSPageViewControllerPage.m deleted file mode 100644 index 3364849..0000000 --- a/MSPageViewController/Source/MSPageViewControllerPage.m +++ /dev/null @@ -1,15 +0,0 @@ -// -// MSPageViewControllerPage.m -// MSPageViewController -// -// Created by Nacho Soto on 2/16/14. -// Copyright (c) 2014 MindSnacks. All rights reserved. -// - -#import "MSPageViewControllerPage.h" - -@implementation MSPageViewControllerPage - -@synthesize pageIndex; - -@end diff --git a/MSPageViewController/Source/UIViewController+MSPageViewController.h b/MSPageViewController/Source/UIViewController+MSPageViewController.h new file mode 100644 index 0000000..1fc9972 --- /dev/null +++ b/MSPageViewController/Source/UIViewController+MSPageViewController.h @@ -0,0 +1,14 @@ +// +// UIViewController+MSPageViewController.h +// MSPageViewController +// +// Created by Christoph Keller on 04.12.14. +// + +#import + +@interface UIViewController (MSPageViewController) + +@property (nonatomic) NSInteger pageIndex; + +@end \ No newline at end of file diff --git a/MSPageViewController/Source/UIViewController+MSPageViewController.m b/MSPageViewController/Source/UIViewController+MSPageViewController.m new file mode 100644 index 0000000..456a4cc --- /dev/null +++ b/MSPageViewController/Source/UIViewController+MSPageViewController.m @@ -0,0 +1,24 @@ +// +// UIViewController+MSPageViewController.m +// MSPageViewController +// +// Created by Christoph Keller on 04.12.14. +// + +#import "UIViewController+MSPageViewController.h" +#import + +static char kMSPageViewControllerPageIndexKey; + +@implementation UIViewController (MSPageViewController) + +- (NSInteger)pageIndex { + NSNumber *number = (NSNumber *)objc_getAssociatedObject(self, &kMSPageViewControllerPageIndexKey); + return [number integerValue]; +} + +- (void)setPageIndex:(NSInteger)pageIndex { + objc_setAssociatedObject(self, &kMSPageViewControllerPageIndexKey, @(pageIndex), OBJC_ASSOCIATION_RETAIN_NONATOMIC); +} + +@end \ No newline at end of file diff --git a/README.md b/README.md index 5bd79fc..ed9c430 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,6 @@ First you must create a [subclass of ```MSPageViewController```](MSPageViewContr Then you have to create a storyboard, add a ```UIPageViewController``` object and change its class to ```MSPageViewController```. Then you can add the controllers, setting their ```Storyboard ID```s to what you returned in ```pageIdentifiers```. -Each of them must be a class that conforms to ```MSPageViewControllerChild``` (if you don't need to add any extra functionality to it you can use [```MSPageViewControllerPage```](MSPageViewController/Source/MSPageViewControllerPage.h)). When your controller is instantiated, it will use these controllers to create each page.