diff --git a/AsyncDisplayKit/ASPagerNode.m b/AsyncDisplayKit/ASPagerNode.m index e7a93b11a1..21310e754e 100644 --- a/AsyncDisplayKit/ASPagerNode.m +++ b/AsyncDisplayKit/ASPagerNode.m @@ -14,6 +14,8 @@ #import "ASDelegateProxy.h" #import "ASDisplayNode+Subclasses.h" #import "ASPagerFlowLayout.h" +#import "ASAssert.h" +#import "ASCellNode.h" @interface ASPagerNode () { @@ -21,11 +23,16 @@ __weak id _pagerDataSource; ASPagerNodeProxy *_proxyDataSource; - BOOL _pagerDataSourceImplementsNodeBlockAtIndex; + struct { + unsigned nodeBlockAtIndex:1; + unsigned nodeAtIndex:1; + } _pagerDataSourceFlags; __weak id _pagerDelegate; + struct { + unsigned constrainedSizeForNode:1; + } _pagerDelegateFlags; ASPagerNodeProxy *_proxyDelegate; - BOOL _pagerDelegateImplementsConstrainedSizeForNode; } @end @@ -122,12 +129,17 @@ - (ASCellNodeBlock)collectionNode:(ASCollectionNode *)collectionNode nodeBlockForItemAtIndexPath:(NSIndexPath *)indexPath { - ASDisplayNodeAssert(_pagerDataSource != nil, @"ASPagerNode must have a data source to load nodes to display"); - if (!_pagerDataSourceImplementsNodeBlockAtIndex) { + if (_pagerDataSourceFlags.nodeBlockAtIndex) { + return [_pagerDataSource pagerNode:self nodeBlockAtIndex:indexPath.item]; + } else if (_pagerDataSourceFlags.nodeAtIndex) { ASCellNode *node = [_pagerDataSource pagerNode:self nodeAtIndex:indexPath.item]; return ^{ return node; }; + } else { + ASDisplayNodeFailAssert(@"Pager data source must implement either %@ or %@. Data source: %@", NSStringFromSelector(@selector(pagerNode:nodeBlockAtIndex:)), NSStringFromSelector(@selector(pagerNode:nodeAtIndex:)), _pagerDataSource); + return ^{ + return [[ASCellNode alloc] init]; + }; } - return [_pagerDataSource pagerNode:self nodeBlockAtIndex:indexPath.item]; } - (NSInteger)collectionNode:(ASCollectionNode *)collectionNode numberOfItemsInSection:(NSInteger)section @@ -140,7 +152,7 @@ - (ASSizeRange)collectionNode:(ASCollectionNode *)collectionNode constrainedSizeForItemAtIndexPath:(NSIndexPath *)indexPath { - if (_pagerDelegateImplementsConstrainedSizeForNode) { + if (_pagerDelegateFlags.constrainedSizeForNode) { return [_pagerDelegate pagerNode:self constrainedSizeForNodeAtIndex:indexPath.item]; } @@ -159,9 +171,12 @@ if (dataSource != _pagerDataSource) { _pagerDataSource = dataSource; - _pagerDataSourceImplementsNodeBlockAtIndex = [_pagerDataSource respondsToSelector:@selector(pagerNode:nodeBlockAtIndex:)]; - // Data source must implement pagerNode:nodeBlockAtIndex: or pagerNode:nodeAtIndex: - ASDisplayNodeAssertTrue(_pagerDataSourceImplementsNodeBlockAtIndex || [_pagerDataSource respondsToSelector:@selector(pagerNode:nodeAtIndex:)]); + if (dataSource == nil) { + memset(&_pagerDataSourceFlags, 0, sizeof(_pagerDataSourceFlags)); + } else { + _pagerDataSourceFlags.nodeBlockAtIndex = [_pagerDataSource respondsToSelector:@selector(pagerNode:nodeBlockAtIndex:)]; + _pagerDataSourceFlags.nodeAtIndex = [_pagerDataSource respondsToSelector:@selector(pagerNode:nodeAtIndex:)]; + } _proxyDataSource = dataSource ? [[ASPagerNodeProxy alloc] initWithTarget:dataSource interceptor:self] : nil; @@ -174,7 +189,11 @@ if (delegate != _pagerDelegate) { _pagerDelegate = delegate; - _pagerDelegateImplementsConstrainedSizeForNode = [_pagerDelegate respondsToSelector:@selector(pagerNode:constrainedSizeForNodeAtIndex:)]; + if (delegate == nil) { + memset(&_pagerDelegateFlags, 0, sizeof(_pagerDelegateFlags)); + } else { + _pagerDelegateFlags.constrainedSizeForNode = [_pagerDelegate respondsToSelector:@selector(pagerNode:constrainedSizeForNodeAtIndex:)]; + } _proxyDelegate = delegate ? [[ASPagerNodeProxy alloc] initWithTarget:delegate interceptor:self] : nil; diff --git a/AsyncDisplayKitTests/ASViewControllerTests.m b/AsyncDisplayKitTests/ASViewControllerTests.m index e7c7038ceb..24a24a3fce 100644 --- a/AsyncDisplayKitTests/ASViewControllerTests.m +++ b/AsyncDisplayKitTests/ASViewControllerTests.m @@ -34,7 +34,7 @@ XCTAssertNotEqual(scrollNode.view.contentInset.top, 0); } -- (void)DISABLED_testThatViewControllerFrameIsRightAfterCustomTransitionWithNonextendedEdges +- (void)testThatViewControllerFrameIsRightAfterCustomTransitionWithNonextendedEdges { UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; ASDisplayNode *node = [[ASDisplayNode alloc] init];