diff options
author | Joel Fischer <joeljfischer@gmail.com> | 2021-08-11 15:53:55 -0400 |
---|---|---|
committer | Joel Fischer <joeljfischer@gmail.com> | 2021-08-11 15:53:55 -0400 |
commit | d0ddd9a546bf09451d721a3670ecfd1315871759 (patch) | |
tree | 0ec76e06d7e0d3aaf736e2d1b725aa6316b8b413 /SmartDeviceLinkTests/DevAPISpecs | |
parent | 24905c8223f133d8d867650e98e3b884c3846c86 (diff) | |
download | sdl_ios-d0ddd9a546bf09451d721a3670ecfd1315871759.tar.gz |
Menu manager fixes
* Fix inserting cells with subcells into list
* Cell Ids now handled by operations
* A whole host of test updates
Diffstat (limited to 'SmartDeviceLinkTests/DevAPISpecs')
4 files changed, 128 insertions, 58 deletions
diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m index b1b99bee5..f0623ab49 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuManagerSpec.m @@ -31,8 +31,6 @@ @property (copy, nonatomic) NSArray<SDLMenuCell *> *currentMenuCells; @property (strong, nonatomic, nullable) SDLMenuConfiguration *currentMenuConfiguration; -@property (assign, nonatomic) UInt32 lastMenuId; - @end QuickSpecBegin(SDLMenuManagerSpec) @@ -83,7 +81,6 @@ describe(@"menu manager", ^{ expect(testManager.currentSystemContext).to(beNil()); expect(testManager.currentMenuCells).to(beEmpty()); expect(testManager.currentMenuConfiguration).to(beNil()); - expect(testManager.lastMenuId).to(equal(1)); }); // when the manager stops @@ -105,7 +102,6 @@ describe(@"menu manager", ^{ expect(testManager.currentSystemContext).to(beNil()); expect(testManager.currentMenuCells).to(beEmpty()); expect(testManager.currentMenuConfiguration).to(beNil()); - expect(testManager.lastMenuId).to(equal(1)); }); }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m index b3b0c53da..9fb4a7883 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceOperationSpec.m @@ -17,13 +17,14 @@ @interface SDLMenuCell () +@property (assign, nonatomic) UInt32 parentCellId; @property (assign, nonatomic) UInt32 cellId; @end QuickSpecBegin(SDLMenuReplaceOperationSpec) -fdescribe(@"a menu replace operation", ^{ +describe(@"a menu replace operation", ^{ __block SDLMenuReplaceOperation *testOp = nil; __block TestConnectionManager *testConnectionManager = nil; @@ -61,15 +62,10 @@ fdescribe(@"a menu replace operation", ^{ testArtwork3.overwrite = YES; textOnlyCell = [[SDLMenuCell alloc] initWithTitle:@"Test 1" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - textOnlyCell.cellId = 1; + textOnlyCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 5" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; textAndImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 2" secondaryText:nil tertiaryText:nil icon:testArtwork secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - textAndImageCell.cellId = 2; submenuCell = [[SDLMenuCell alloc] initWithTitle:@"Test 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[textOnlyCell, textAndImageCell]]; - submenuCell.cellId = 3; submenuImageCell = [[SDLMenuCell alloc] initWithTitle:@"Test 4" secondaryText:nil tertiaryText:nil icon:testArtwork2 secondaryArtwork:nil submenuLayout:SDLMenuLayoutTiles subCells:@[textOnlyCell]]; - submenuImageCell.cellId = 4; - textOnlyCell2 = [[SDLMenuCell alloc] initWithTitle:@"Test 5" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - textOnlyCell2.cellId = 5; addCommandSuccessResponse = [[SDLAddCommandResponse alloc] init]; addCommandSuccessResponse.success = @YES; @@ -233,7 +229,7 @@ fdescribe(@"a menu replace operation", ^{ testNewMenu = @[submenuCell]; }); - fit(@"should send an appropriate number of AddSubmenu and AddCommandRequests", ^{ + it(@"should send an appropriate number of AddSubmenu and AddCommandRequests", ^{ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock]; [testOp start]; @@ -261,7 +257,6 @@ fdescribe(@"a menu replace operation", ^{ }); }); - // updating a menu without dynamic updates describe(@"updating a menu without dynamic updates", ^{ context(@"adding a text cell", ^{ beforeEach(^{ @@ -273,10 +268,7 @@ fdescribe(@"a menu replace operation", ^{ testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:YES currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock]; [testOp start]; - SDLDeleteCommandResponse *deleteCommandResponse = [[SDLDeleteCommandResponse alloc] init]; - deleteCommandResponse.success = @YES; - deleteCommandResponse.resultCode = SDLResultSuccess; - [testConnectionManager respondToLastRequestWithResponse:deleteCommandResponse]; + [testConnectionManager respondToLastRequestWithResponse:deleteCommandSuccessResponse]; [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; @@ -287,6 +279,16 @@ fdescribe(@"a menu replace operation", ^{ expect(deletes).to(haveCount(1)); expect(adds).to(haveCount(2)); + + [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:1 error:nil]; + [testConnectionManager respondToRequestWithResponse:addCommandSuccessResponse requestNumber:2 error:nil]; + [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + expect(testOp.isFinished).to(beTrue()); + expect(resultError).to(beNil()); + expect(resultMenuCells).to(haveCount(2)); + expect(resultMenuCells[0]).to(equal(textOnlyCell)); + expect(resultMenuCells[1]).to(equal(textOnlyCell2)); }); }); }); @@ -311,33 +313,57 @@ fdescribe(@"a menu replace operation", ^{ expect(deletes).to(haveCount(0)); expect(adds).to(haveCount(1)); + + [testConnectionManager respondToLastRequestWithResponse:addCommandSuccessResponse]; + [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + expect(testOp.isFinished).to(beTrue()); + expect(resultError).to(beNil()); + expect(resultMenuCells).to(haveCount(2)); + }); + }); + + context(@"rearranging cells with subcells", ^{ + beforeEach(^{ + testCurrentMenu = @[textOnlyCell, submenuCell, submenuImageCell]; + testNewMenu = @[submenuCell, submenuImageCell, textOnlyCell]; + + OCMStub([testFileManager uploadArtworks:[OCMArg any] progressHandler:([OCMArg invokeBlockWithArgs:textAndImageCell.icon.name, @1.0, [NSNull null], nil]) completionHandler:([OCMArg invokeBlockWithArgs: @[textAndImageCell.icon.name], [NSNull null], nil])]); + }); + + it(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{ + testOp = [[SDLMenuReplaceOperation alloc] initWithConnectionManager:testConnectionManager fileManager:testFileManager windowCapability:testWindowCapability menuConfiguration:testMenuConfiguration currentMenu:testCurrentMenu updatedMenu:testNewMenu compatibilityModeEnabled:NO currentMenuUpdatedHandler:testCurrentMenuUpdatedBlock]; + [testOp start]; + + // Delete textOnlyCell + [testConnectionManager respondToLastRequestWithResponse:deleteCommandSuccessResponse]; + [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + expect(testOp.currentMenu).toNot(contain(textOnlyCell)); + + // Add textOnlyCell + [testConnectionManager respondToLastRequestWithResponse:addCommandSuccessResponse]; + [testConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; + + NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; + NSArray *deletes = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; + + NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; + NSArray *adds = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; + + NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; + NSArray *submenu = [[testConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; + + expect(deletes).to(haveCount(1)); + expect(adds).to(haveCount(1)); + expect(submenu).to(haveCount(0)); + + expect(testOp.isFinished).to(beTrue()); + expect(resultError).to(beNil()); + expect(resultMenuCells).to(haveCount(3)); }); }); }); -// it(@"should send dynamic deletes first then dynamic adds case with 2 submenu cells", ^{ -// testManager.menuCells = @[textOnlyCell, submenuCell, submenuImageCell]; -// [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; -// [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; -// [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; -// -// testManager.menuCells = @[submenuCell, submenuImageCell, textOnlyCell]; -// [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; -// [mockConnectionManager respondToLastMultipleRequestsWithSuccess:YES]; -// -// NSPredicate *deleteCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLDeleteCommand class]]; -// NSArray *deletes = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:deleteCommandPredicate]; -// -// NSPredicate *addCommandPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass:%@", [SDLAddCommand class]]; -// NSArray *adds = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addCommandPredicate]; -// -// NSPredicate *addSubmenuPredicate = [NSPredicate predicateWithFormat:@"self isMemberOfClass: %@", [SDLAddSubMenu class]]; -// NSArray *submenu = [[mockConnectionManager.receivedRequests copy] filteredArrayUsingPredicate:addSubmenuPredicate]; -// -// expect(deletes).to(haveCount(1)); -// expect(adds).to(haveCount(5)); -// expect(submenu).to(haveCount(2)); -// }); // // it(@"should send dynamic deletes first then dynamic adds when removing one submenu cell", ^{ // testManager.menuCells = @[textOnlyCell, textAndImageCell, submenuCell, submenuImageCell]; diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m index fd1a19b01..e3a28a796 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpec.m @@ -7,6 +7,7 @@ #import "SDLFileManager.h" #import "SDLMenuCell.h" #import "SDLMenuReplaceUtilitiesSpecHelpers.h" +#import "SDLMenuManagerPrivateConstants.h" #import "SDLWindowCapability.h" #import "TestConnectionManager.h" @@ -18,6 +19,12 @@ @end +@interface SDLMenuReplaceUtilities () + +@property (class, assign, nonatomic) UInt32 nextMenuId; + +@end + QuickSpecBegin(SDLMenuReplaceUtilitiesSpec) __block NSMutableArray<SDLMenuCell *> *testMenuCells = nil; @@ -36,6 +43,37 @@ __block NSArray<SDLImageField *> *allSupportedImageFields = @[ [[SDLImageField alloc] initWithName:SDLImageFieldNameMenuSubMenuSecondaryImage imageTypeSupported:@[SDLImageTypeDynamic] imageResolution:nil] ]; +describe(@"adding ids", ^{ + it(@"should properly add ids", ^{ + SDLMenuReplaceUtilities.nextMenuId = 0; + testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu; + + [SDLMenuReplaceUtilities updateIdsOnMenuCells:testMenuCells parentId:ParentIdNotFound]; + + expect(testMenuCells[0].cellId).to(equal(1)); + expect(testMenuCells[1].cellId).to(equal(6)); + expect(testMenuCells[2].cellId).to(equal(7)); + + NSArray<SDLMenuCell *> *subCellList1 = testMenuCells[0].subCells; + expect(subCellList1[0].cellId).to(equal(2)); + expect(subCellList1[0].parentCellId).to(equal(1)); + expect(subCellList1[1].cellId).to(equal(5)); + expect(subCellList1[1].parentCellId).to(equal(1)); + + NSArray<SDLMenuCell *> *subCell1SubCellList1 = subCellList1[0].subCells; + expect(subCell1SubCellList1[0].cellId).to(equal(3)); + expect(subCell1SubCellList1[0].parentCellId).to(equal(2)); + expect(subCell1SubCellList1[1].cellId).to(equal(4)); + expect(subCell1SubCellList1[1].parentCellId).to(equal(2)); + + NSArray<SDLMenuCell *> *subCellList2 = testMenuCells[2].subCells; + expect(subCellList2[0].cellId).to(equal(8)); + expect(subCellList2[0].parentCellId).to(equal(7)); + expect(subCellList2[1].cellId).to(equal(9)); + expect(subCellList2[1].parentCellId).to(equal(7)); + }); +}); + describe(@"finding all artworks from cells", ^{ beforeEach(^{ mockFileManager = OCMClassMock([SDLFileManager class]); @@ -267,6 +305,7 @@ describe(@"updating menu cell lists", ^{ context(@"from a shallow list", ^{ beforeEach(^{ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu; + [SDLMenuReplaceUtilities updateIdsOnMenuCells:testMenuCells parentId:ParentIdNotFound]; }); context(@"when the cell is in the menu", ^{ @@ -303,6 +342,7 @@ describe(@"updating menu cell lists", ^{ context(@"from a deep list", ^{ beforeEach(^{ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu; + [SDLMenuReplaceUtilities updateIdsOnMenuCells:testMenuCells parentId:ParentIdNotFound]; }); context(@"when the cell is in the top menu", ^{ @@ -360,6 +400,7 @@ describe(@"updating menu cell lists", ^{ context(@"from a shallow list", ^{ beforeEach(^{ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.topLevelOnlyMenu; + [SDLMenuReplaceUtilities updateIdsOnMenuCells:testMenuCells parentId:ParentIdNotFound]; SDLMenuCell *newCell = [[SDLMenuCell alloc] initWithTitle:@"New Cell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; newCell.cellId = 99; @@ -409,23 +450,30 @@ describe(@"updating menu cell lists", ^{ }); }); - context(@"from a deep list", ^{ + fcontext(@"from a deep list", ^{ + __block SDLMenuCell *subCell = nil; + __block NSMutableArray<SDLMenuCell *> *newMenu = nil; + beforeEach(^{ testMenuCells = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu; + [SDLMenuReplaceUtilities updateIdsOnMenuCells:testMenuCells parentId:ParentIdNotFound]; - SDLMenuCell *subCell = [[SDLMenuCell alloc] initWithTitle:@"New SubCell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - subCell.cellId = 98; - SDLMenuCell *newCell = [[SDLMenuCell alloc] initWithTitle:@"New Cell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:@[subCell]]; - newCell.cellId = 99; - newCellList = [@[newCell] mutableCopy]; + newMenu = SDLMenuReplaceUtilitiesSpecHelpers.deepMenu.mutableCopy; + NSMutableArray<SDLMenuCell *> *subMenuToUpdate = newMenu[0].subCells.mutableCopy; + subCell = [[SDLMenuCell alloc] initWithTitle:@"New SubCell" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; + [subMenuToUpdate insertObject:subCell atIndex:0]; + newMenu[0].subCells = subMenuToUpdate.copy; + + [SDLMenuReplaceUtilities updateIdsOnMenuCells:newMenu parentId:ParentIdNotFound]; }); it(@"should properly add the subcell to the list", ^{ - BOOL didAddCell = [SDLMenuReplaceUtilities addCellWithCellId:98 position:0 fromNewMenuList:newCellList toMainMenuList:testMenuCells]; + BOOL didAddCell = [SDLMenuReplaceUtilities addCellWithCellId:newMenu[0].subCells[0].cellId position:0 fromNewMenuList:newMenu toMainMenuList:testMenuCells]; expect(didAddCell).to(beTrue()); - expect(testMenuCells).to(haveCount(4)); - expect(testMenuCells[0]).to(equal(newCellList[0].subCells[0])); + expect(testMenuCells).to(haveCount(3)); + expect(testMenuCells[0].subCells).to(haveCount(3)); + expect(testMenuCells[0].subCells[0]).to(equal(subCell)); }); }); }); diff --git a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m index 2b9bef2b9..acb885b67 100644 --- a/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m +++ b/SmartDeviceLinkTests/DevAPISpecs/SDLMenuReplaceUtilitiesSpecHelpers.m @@ -49,29 +49,29 @@ SDLArtwork *artwork4 = [[SDLArtwork alloc] initWithData:cellArtData4 name:@"Test Art 4" fileExtension:@"png" persistent:NO]; SDLMenuCell *subList1SubList1Cell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 1" tertiaryText:@"Sub-SubItem 1" icon:nil secondaryArtwork:artwork3 voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - subList1SubList1Cell1.cellId = 1; +// subList1SubList1Cell1.cellId = 1; SDLMenuCell *subList1SubList1Cell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 1" tertiaryText:@"Sub-SubItem 2" icon:artwork1 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - subList1SubList1Cell2.cellId = 2; +// subList1SubList1Cell2.cellId = 2; NSArray<SDLMenuCell *> *subList1SubList1 = @[subList1SubList1Cell1, subList1SubList1Cell2]; SDLMenuCell *subList1Cell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 1" tertiaryText:nil icon:artwork4 secondaryArtwork:nil submenuLayout:nil subCells:subList1SubList1]; - subList1Cell1.cellId = 3; +// subList1Cell1.cellId = 3; SDLMenuCell *subList1Cell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:@"SubItem 2" tertiaryText:nil icon:artwork2 secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - subList1Cell2.cellId = 4; +// subList1Cell2.cellId = 4; NSArray<SDLMenuCell *> *subList1 = @[subList1Cell1, subList1Cell2]; SDLMenuCell *subList2Cell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 3" secondaryText:@"SubItem 1" tertiaryText:nil icon:artwork1 secondaryArtwork:artwork4 voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - subList2Cell1.cellId = 5; +// subList2Cell1.cellId = 5; SDLMenuCell *subList2Cell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 3" secondaryText:@"SubItem 2" tertiaryText:nil icon:artwork1 secondaryArtwork:artwork2 voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - subList2Cell2.cellId = 6; +// subList2Cell2.cellId = 6; NSArray<SDLMenuCell *> *subList2 = @[subList2Cell1, subList2Cell2]; SDLMenuCell *topListCell1 = [[SDLMenuCell alloc] initWithTitle:@"Item 1" secondaryText:nil tertiaryText:nil icon:artwork1 secondaryArtwork:nil submenuLayout:nil subCells:subList1]; - topListCell1.cellId = 7; +// topListCell1.cellId = 7; SDLMenuCell *topListCell2 = [[SDLMenuCell alloc] initWithTitle:@"Item 2" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil voiceCommands:nil handler:^(SDLTriggerSource _Nonnull triggerSource) {}]; - topListCell2.cellId = 8; +// topListCell2.cellId = 8; SDLMenuCell *topListCell3 = [[SDLMenuCell alloc] initWithTitle:@"Item 3" secondaryText:nil tertiaryText:nil icon:nil secondaryArtwork:nil submenuLayout:nil subCells:subList2]; - topListCell3.cellId = 9; +// topListCell3.cellId = 9; return [@[topListCell1, topListCell2, topListCell3] mutableCopy]; } |