Skip to content

Commit

Permalink
Merge pull request #3 from ninjinkun/fix/delegate-method-not-forward
Browse files Browse the repository at this point in the history
Fixed delegate methods are not forwarded
  • Loading branch information
ninjinkun committed Jan 13, 2014
2 parents 5dcae93 + ac6be8f commit ac1c7cf
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 19 deletions.
4 changes: 1 addition & 3 deletions DemoApp/ViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,11 @@ - (void)viewDidLoad
self.refreshControl = [[UIRefreshControl alloc] init];
[self.refreshControl addTarget:self action:@selector(refreshControlValueChanged:) forControlEvents:UIControlEventValueChanged];

_scrollProxy = [[NJKScrollFullScreen alloc] init];
_scrollProxy = [[NJKScrollFullScreen alloc] initWithForwardTarget:self]; // UIScrollViewDelegate and UITableViewDelegate methods proxy to ViewController

self.tableView.delegate = (id)_scrollProxy; // cast for surpress incompatible warnings

_scrollProxy.delegate = self;
_scrollProxy.scrollViewDelegate = self; // UIScrollViewDelegate methods proxy to ViewController

if (!IS_RUNNING_IOS7) {
// support full screen on iOS 6
Expand Down Expand Up @@ -126,5 +125,4 @@ - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrie
[self showToolbar:YES];
}


@end
3 changes: 1 addition & 2 deletions DemoApp/WebViewController.m
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,10 @@ - (void)viewDidLoad
{
[super viewDidLoad];

_scrollProxy = [[NJKScrollFullScreen alloc] init];
_scrollProxy = [[NJKScrollFullScreen alloc] initWithForwardTarget:self.webView];

self.webView.scrollView.delegate = _scrollProxy;
_scrollProxy.delegate = self;
_scrollProxy.scrollViewDelegate = self.webView;

[self.webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.apple.com/macbook-pro/"]]];
}
Expand Down
2 changes: 1 addition & 1 deletion NJKScrollFullScreen/NJKScrollFullScreen.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@
@interface NJKScrollFullScreen : NSObject<UIScrollViewDelegate>

@property (nonatomic, weak) id<NJKScrollFullscreenDelegate> delegate;
@property (nonatomic, weak) id<UIScrollViewDelegate>scrollViewDelegate;

@property (nonatomic) CGFloat upThresholdY; // up distance until fire. default 0 px.
@property (nonatomic) CGFloat downThresholdY; // down distance until fire. default 200 px.

- (id)initWithForwardTarget:(id)forwardTarget;
- (void)reset;

@end
Expand Down
33 changes: 22 additions & 11 deletions NJKScrollFullScreen/NJKScrollFullScreen.m
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,19 @@ @interface NJKScrollFullScreen ()
@property (nonatomic) NJKScrollDirection previousScrollDirection;
@property (nonatomic) CGFloat previousOffsetY;
@property (nonatomic) CGFloat accumulatedY;
@property (nonatomic, weak) id<UIScrollViewDelegate> forwardTarget;
@end

@implementation NJKScrollFullScreen

- (id)init
- (id)initWithForwardTarget:(id)forwardTarget
{
self = [super init];
if (self) {
[self reset];
_downThresholdY = 200.0;
_upThresholdY = 0.0;
_forwardTarget = forwardTarget;
}
return self;
}
Expand All @@ -47,8 +49,8 @@ - (void)reset

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
if ([_scrollViewDelegate respondsToSelector:@selector(scrollViewDidScroll:)]) {
[_scrollViewDelegate scrollViewDidScroll:scrollView];
if ([_forwardTarget respondsToSelector:@selector(scrollViewDidScroll:)]) {
[_forwardTarget scrollViewDidScroll:scrollView];
}

CGFloat currentOffsetY = scrollView.contentOffset.y;
Expand Down Expand Up @@ -106,8 +108,8 @@ - (void)scrollViewDidScroll:(UIScrollView *)scrollView

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if ([_scrollViewDelegate respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)]) {
[_scrollViewDelegate scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
if ([_forwardTarget respondsToSelector:@selector(scrollViewDidEndDragging:willDecelerate:)]) {
[_forwardTarget scrollViewDidEndDragging:scrollView willDecelerate:decelerate];
}

CGFloat currentOffsetY = scrollView.contentOffset.y;
Expand Down Expand Up @@ -148,8 +150,8 @@ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
BOOL ret = YES;
if ([_scrollViewDelegate respondsToSelector:@selector(scrollViewShouldScrollToTop:)]) {
ret = [_scrollViewDelegate scrollViewShouldScrollToTop:scrollView];
if ([_forwardTarget respondsToSelector:@selector(scrollViewShouldScrollToTop:)]) {
ret = [_forwardTarget scrollViewShouldScrollToTop:scrollView];
}
if ([_delegate respondsToSelector:@selector(scrollFullScreenScrollViewDidEndDraggingScrollDown:)]) {
[_delegate scrollFullScreenScrollViewDidEndDraggingScrollDown:self];
Expand All @@ -164,18 +166,27 @@ - (NSMethodSignature *)methodSignatureForSelector:(SEL)selector
{
NSMethodSignature *signature = [super methodSignatureForSelector:selector];
if(!signature) {
if([_scrollViewDelegate respondsToSelector:selector]) {
return [(id)_scrollViewDelegate methodSignatureForSelector:selector];
if([_forwardTarget respondsToSelector:selector]) {
return [(id)_forwardTarget methodSignatureForSelector:selector];
}
}
return signature;
}

- (void)forwardInvocation:(NSInvocation*)invocation
{
if ([_scrollViewDelegate respondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:_scrollViewDelegate];
if ([_forwardTarget respondsToSelector:[invocation selector]]) {
[invocation invokeWithTarget:_forwardTarget];
}
}

- (BOOL)respondsToSelector:(SEL)aSelector
{
BOOL ret = [super respondsToSelector:aSelector];
if (!ret) {
ret = [_forwardTarget respondsToSelector:aSelector];
}
return ret;
}

@end
3 changes: 1 addition & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,9 @@ Instance and set `UIScrollViewDelegate` on your view controller. If you set `scr
{
[super viewDidLoad];

_scrollProxy = [[NJKScrollFullScreen alloc] init];
_scrollProxy = [[NJKScrollFullScreen alloc] initWithForwardTarget:self]; // UIScrollViewDelegate and UITableViewDelegate methods proxy to ViewController
self.tableView.delegate = (id)_scrollProxy; // cast for surpress incompatible warnings
_scrollProxy.delegate = self;
_scrollProxy.scrollViewDelegate = self; // UIScrollViewDelegate methods proxy to ViewController
}
```

Expand Down

0 comments on commit ac1c7cf

Please sign in to comment.