diff --git a/AsyncDisplayKit/ASCellNode+Internal.h b/AsyncDisplayKit/ASCellNode+Internal.h index b185d4ed01..58c099f2ab 100644 --- a/AsyncDisplayKit/ASCellNode+Internal.h +++ b/AsyncDisplayKit/ASCellNode+Internal.h @@ -46,4 +46,7 @@ */ @property (nonatomic, weak) UIScrollView *scrollView; +- (void)__setSelectedFromUIKit:(BOOL)selected; +- (void)__setHighlightedFromUIKit:(BOOL)highlighted; + @end diff --git a/AsyncDisplayKit/ASCellNode.mm b/AsyncDisplayKit/ASCellNode.mm index 851521a857..1b9c69de5b 100644 --- a/AsyncDisplayKit/ASCellNode.mm +++ b/AsyncDisplayKit/ASCellNode.mm @@ -31,6 +31,7 @@ ASDisplayNodeDidLoadBlock _viewControllerDidLoadBlock; ASDisplayNode *_viewControllerNode; UIViewController *_viewController; + BOOL _suspendInteractionDelegate; } @end @@ -182,16 +183,38 @@ { if (_selected != selected) { _selected = selected; - [_interactionDelegate nodeSelectedStateDidChange:self]; + if (!_suspendInteractionDelegate) { + [_interactionDelegate nodeSelectedStateDidChange:self]; + } } } - (void)setHighlighted:(BOOL)highlighted { if (_highlighted != highlighted) { - _highlighted = highlighted; + _highlighted = highlighted; + if (!_suspendInteractionDelegate) { [_interactionDelegate nodeHighlightedStateDidChange:self]; } + } +} + +- (void)__setSelectedFromUIKit:(BOOL)selected; +{ + if (selected != _selected) { + _suspendInteractionDelegate = YES; + self.selected = selected; + _suspendInteractionDelegate = NO; + } +} + +- (void)__setHighlightedFromUIKit:(BOOL)highlighted; +{ + if (highlighted != _highlighted) { + _suspendInteractionDelegate = YES; + self.highlighted = highlighted; + _suspendInteractionDelegate = NO; + } } - (BOOL)selected diff --git a/AsyncDisplayKit/ASCollectionView.mm b/AsyncDisplayKit/ASCollectionView.mm index e5546436ac..c81450e267 100644 --- a/AsyncDisplayKit/ASCollectionView.mm +++ b/AsyncDisplayKit/ASCollectionView.mm @@ -43,31 +43,23 @@ static NSString * const kCellReuseIdentifier = @"_ASCollectionViewCell"; { _node = node; if (node.selected != self.selected) { - node.selected = self.selected; + [node __setSelectedFromUIKit:self.selected]; } if (node.highlighted != self.highlighted) { - node.highlighted = self.highlighted; + [node __setHighlightedFromUIKit:self.highlighted]; } } - (void)setSelected:(BOOL)selected { - if (selected != self.selected) { - [super setSelected:selected]; - } - if (selected != _node.selected) { - _node.selected = selected; - } + [super setSelected:selected]; + [_node __setSelectedFromUIKit:selected]; } - (void)setHighlighted:(BOOL)highlighted { - if (highlighted != self.highlighted) { - [super setHighlighted:highlighted]; - } - if (highlighted != _node.highlighted) { - _node.highlighted = highlighted; - } + [super setHighlighted:highlighted]; + [_node __setHighlightedFromUIKit:highlighted]; } - (void)prepareForReuse diff --git a/AsyncDisplayKit/ASTableView.mm b/AsyncDisplayKit/ASTableView.mm index db73c8049c..4f04ede236 100644 --- a/AsyncDisplayKit/ASTableView.mm +++ b/AsyncDisplayKit/ASTableView.mm @@ -68,31 +68,23 @@ static NSString * const kCellReuseIdentifier = @"_ASTableViewCell"; { _node = node; if (node.selected != self.selected) { - node.selected = self.selected; + [node __setSelectedFromUIKit:self.selected]; } if (node.highlighted != self.highlighted) { - node.highlighted = self.highlighted; + [node __setHighlightedFromUIKit:self.highlighted]; } } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { - if (selected != self.selected) { - [super setSelected:selected animated:animated]; - } - if (selected != _node.selected) { - _node.selected = selected; - } + [super setSelected:selected animated:animated]; + [_node __setSelectedFromUIKit:selected]; } - (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated { - if (highlighted != self.highlighted) { - [super setHighlighted:highlighted animated:animated]; - } - if (highlighted != _node.highlighted) { - _node.highlighted = highlighted; - } + [super setHighlighted:highlighted animated:animated]; + [_node __setHighlightedFromUIKit:highlighted]; } - (void)prepareForReuse diff --git a/AsyncDisplayKitTests/ASCollectionViewTests.m b/AsyncDisplayKitTests/ASCollectionViewTests.m index 5253562d6d..914b884bcb 100644 --- a/AsyncDisplayKitTests/ASCollectionViewTests.m +++ b/AsyncDisplayKitTests/ASCollectionViewTests.m @@ -179,9 +179,8 @@ [testController.collectionView deselectItemAtIndexPath:indexPath animated:NO]; XCTAssertTrue(node.isSelected == NO, @"Deselecting cell should update node selection."); - // selecting cell should select node - UICollectionViewCell *cell = [testController.collectionView cellForItemAtIndexPath:indexPath]; - cell.selected = YES; + // select the cell again, scroll down and back up, and check that the state persisted + [testController.collectionView selectItemAtIndexPath:indexPath animated:NO scrollPosition:UICollectionViewScrollPositionNone]; XCTAssertTrue(node.isSelected == YES, @"Selecting cell should update node selection."); // reload cell (-prepareForReuse is called) & check that selected state is preserved @@ -192,7 +191,7 @@ XCTAssertTrue(node.isSelected == YES, @"Reloaded cell should preserve state."); // deselecting cell should deselect node - cell = [testController.collectionView cellForItemAtIndexPath:indexPath]; + UICollectionViewCell *cell = [testController.collectionView cellForItemAtIndexPath:indexPath]; cell.selected = NO; XCTAssertTrue(node.isSelected == NO, @"Deselecting cell should update node selection.");