diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ac68ab0..74dba8fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -114,6 +114,8 @@ This release closes the [3.0.0 milestone](https://github.com/Instagram/IGListKit - When setting the collection view on `IGListAdapter`, its layout is now properly invalidated. [Jesse Squires](https://github.com/jessesquires) [(#677)](https://github.com/Instagram/IGListKit/pull/677) +- Fixes a bug when reusing `UICollectionView`s with multiple `IGListAdapter`s in an embedded environment that would accidentally `nil` the `collectionView` property of another adapter. [Ryan Nystrom](https://github.com/rnystrom) [(#721)](https://github.com/Instagram/IGListKit/pull/721) + 2.1.0 ----- diff --git a/Source/IGListAdapter.m b/Source/IGListAdapter.m index ec4bee2b..e6dadd34 100644 --- a/Source/IGListAdapter.m +++ b/Source/IGListAdapter.m @@ -81,6 +81,7 @@ if (globalCollectionViewAdapterMap == nil) { globalCollectionViewAdapterMap = [NSMapTable weakToWeakObjectsMapTable]; } + [globalCollectionViewAdapterMap removeObjectForKey:_collectionView]; [[globalCollectionViewAdapterMap objectForKey:collectionView] setCollectionView:nil]; [globalCollectionViewAdapterMap setObject:self forKey:collectionView]; diff --git a/Tests/IGListAdapterTests.m b/Tests/IGListAdapterTests.m index 2d2c8b53..cac8ff68 100644 --- a/Tests/IGListAdapterTests.m +++ b/Tests/IGListAdapterTests.m @@ -1214,4 +1214,38 @@ 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