Skip to content

Commit

Permalink
Fix reusing collection views among multiple adapters
Browse files Browse the repository at this point in the history
  • Loading branch information
Ryan Nystrom committed May 9, 2017
1 parent 034f162 commit f829ba7
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 0 deletions.
1 change: 1 addition & 0 deletions Source/IGListAdapter.m
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ - (void)setCollectionView:(UICollectionView *)collectionView {
if (globalCollectionViewAdapterMap == nil) {
globalCollectionViewAdapterMap = [NSMapTable weakToWeakObjectsMapTable];
}
[globalCollectionViewAdapterMap removeObjectForKey:_collectionView];
[[globalCollectionViewAdapterMap objectForKey:collectionView] setCollectionView:nil];
[globalCollectionViewAdapterMap setObject:self forKey:collectionView];

Expand Down
34 changes: 34 additions & 0 deletions Tests/IGListAdapterTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -1214,4 +1214,38 @@ - (void)test_withStrongRefToSectionController_thatAdapterSectionIndexIsZero_that
XCTAssertEqual([wAdapter sectionForSectionController:sc], 0);
}

- (void)test_whenSwappingCollectionViews_withMultipleAdapters_thatDoesntNilOtherAdaptersCollectionView {
IGListTestAdapterDataSource *dataSource1 = [IGListTestAdapterDataSource new];
IGListAdapter *adapter1 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];
adapter1.dataSource = dataSource1;

IGListTestAdapterDataSource *dataSource2 = [IGListTestAdapterDataSource new];
IGListAdapter *adapter2 = [[IGListAdapter alloc] initWithUpdater:[IGListAdapterUpdater new] viewController:nil];
adapter2.dataSource = dataSource2;

UICollectionView *collectionView1 = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];
UICollectionView *collectionView2 = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:[UICollectionViewFlowLayout new]];

adapter1.collectionView = collectionView1;
adapter2.collectionView = collectionView2;

XCTAssertEqual(adapter1.collectionView, collectionView1);
XCTAssertEqual(collectionView1.dataSource, adapter1);
XCTAssertEqual(adapter2.collectionView, collectionView2);
XCTAssertEqual(collectionView2.dataSource, adapter2);

adapter2.collectionView = collectionView1;

XCTAssertEqual(adapter2.collectionView, collectionView1);
XCTAssertEqual(collectionView1.dataSource, adapter2);
XCTAssertNil(adapter1.collectionView);

adapter1.collectionView = collectionView2;

XCTAssertEqual(adapter1.collectionView, collectionView2);
XCTAssertEqual(collectionView2.dataSource, adapter1);
XCTAssertEqual(adapter2.collectionView, collectionView1);
XCTAssertEqual(collectionView1.dataSource, adapter2);
}

@end

0 comments on commit f829ba7

Please sign in to comment.