Ver código fonte

ISHOP IOS COMMIT

Ray Zhang 2 anos atrás
pai
commit
34fb807ce6
100 arquivos alterados com 6523 adições e 0 exclusões
  1. 823 0
      RedAnt iShop/iShop.xcodeproj/project.pbxproj
  2. 7 0
      RedAnt iShop/iShop.xcodeproj/project.xcworkspace/contents.xcworkspacedata
  3. 8 0
      RedAnt iShop/iShop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  4. BIN
      RedAnt iShop/iShop.xcodeproj/project.xcworkspace/xcuserdata/ruizhang.xcuserdatad/UserInterfaceState.xcuserstate
  5. 7 0
      RedAnt iShop/iShop.xcworkspace/contents.xcworkspacedata
  6. 8 0
      RedAnt iShop/iShop.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
  7. BIN
      RedAnt iShop/iShop.xcworkspace/xcuserdata/ruizhang.xcuserdatad/UserInterfaceState.xcuserstate
  8. 164 0
      RedAnt iShop/iShop.xcworkspace/xcuserdata/ruizhang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  9. 14 0
      RedAnt iShop/iShop/AppDelegate.h
  10. 43 0
      RedAnt iShop/iShop/AppDelegate.m
  11. 26 0
      RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/Contents.json
  12. BIN
      RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/appicon 1.png
  13. BIN
      RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/appicon 2.png
  14. BIN
      RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/appicon.png
  15. 26 0
      RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/Contents.json
  16. BIN
      RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/appicon 1.png
  17. BIN
      RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/appicon 2.png
  18. BIN
      RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/appicon.png
  19. 26 0
      RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/Contents.json
  20. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/appicon 1.png
  21. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/appicon 2.png
  22. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/appicon.png
  23. 23 0
      RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/Contents.json
  24. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/appicon 1.png
  25. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/appicon 2.png
  26. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/appicon.png
  27. 23 0
      RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/Contents.json
  28. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/appicon 1.png
  29. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/appicon 2.png
  30. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/appicon.png
  31. 23 0
      RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/Contents.json
  32. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/appicon 1.png
  33. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/appicon 2.png
  34. BIN
      RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/appicon.png
  35. 11 0
      RedAnt iShop/iShop/Assets.xcassets/AccentColor.colorset/Contents.json
  36. 13 0
      RedAnt iShop/iShop/Assets.xcassets/AppIcon.appiconset/Contents.json
  37. 6 0
      RedAnt iShop/iShop/Assets.xcassets/Contents.json
  38. 23 0
      RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/Contents.json
  39. BIN
      RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/appicon 1.png
  40. BIN
      RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/appicon 2.png
  41. BIN
      RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/appicon.png
  42. 23 0
      RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/Contents.json
  43. BIN
      RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/appicon 1.png
  44. BIN
      RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/appicon 2.png
  45. BIN
      RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/appicon.png
  46. 23 0
      RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/Contents.json
  47. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/appicon 1.png
  48. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/appicon 2.png
  49. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/appicon.png
  50. 23 0
      RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/Contents.json
  51. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/appicon 1.png
  52. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/appicon 2.png
  53. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/appicon.png
  54. 23 0
      RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/Contents.json
  55. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/appicon 1.png
  56. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/appicon 2.png
  57. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/appicon.png
  58. 23 0
      RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/Contents.json
  59. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/appicon 1.png
  60. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/appicon 2.png
  61. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/appicon.png
  62. 23 0
      RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/Contents.json
  63. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/appicon 1.png
  64. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/appicon 2.png
  65. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/appicon.png
  66. 23 0
      RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/Contents.json
  67. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/appicon 1.png
  68. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/appicon 2.png
  69. BIN
      RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/appicon.png
  70. 23 0
      RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/Contents.json
  71. BIN
      RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/appicon 1.png
  72. BIN
      RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/appicon 2.png
  73. BIN
      RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/appicon.png
  74. 25 0
      RedAnt iShop/iShop/Base.lproj/LaunchScreen.storyboard
  75. 432 0
      RedAnt iShop/iShop/Base.lproj/Main.storyboard
  76. 32 0
      RedAnt iShop/iShop/HomeTableViewCellTopic.h
  77. 129 0
      RedAnt iShop/iShop/HomeTableViewCellTopic.m
  78. 25 0
      RedAnt iShop/iShop/Info.plist
  79. 30 0
      RedAnt iShop/iShop/RASingleton.h
  80. 30 0
      RedAnt iShop/iShop/RASingleton.m
  81. 16 0
      RedAnt iShop/iShop/RootFrame/CartViewController.h
  82. 31 0
      RedAnt iShop/iShop/RootFrame/CartViewController.m
  83. 19 0
      RedAnt iShop/iShop/RootFrame/CatalogViewController.h
  84. 164 0
      RedAnt iShop/iShop/RootFrame/CatalogViewController.m
  85. 680 0
      RedAnt iShop/iShop/RootFrame/Frame.storyboard
  86. 16 0
      RedAnt iShop/iShop/RootFrame/FrameRoot.h
  87. 61 0
      RedAnt iShop/iShop/RootFrame/FrameRoot.m
  88. 25 0
      RedAnt iShop/iShop/RootFrame/HomeViewController.h
  89. 894 0
      RedAnt iShop/iShop/RootFrame/HomeViewController.m
  90. 16 0
      RedAnt iShop/iShop/RootFrame/MyViewController.h
  91. 39 0
      RedAnt iShop/iShop/RootFrame/MyViewController.m
  92. 36 0
      RedAnt iShop/iShop/RootFrame/SearchViewController.h
  93. 767 0
      RedAnt iShop/iShop/RootFrame/SearchViewController.m
  94. 45 0
      RedAnt iShop/iShop/RootFrame/TabViewController.h
  95. 406 0
      RedAnt iShop/iShop/RootFrame/TabViewController.m
  96. 23 0
      RedAnt iShop/iShop/RootFrame/catalog/CatalogCellSmall.h
  97. 12 0
      RedAnt iShop/iShop/RootFrame/catalog/CatalogCellSmall.m
  98. 58 0
      RedAnt iShop/iShop/RootFrame/catalog/CatalogFilterViewController.h
  99. 1007 0
      RedAnt iShop/iShop/RootFrame/catalog/CatalogFilterViewController.m
  100. 47 0
      RedAnt iShop/iShop/RootFrame/catalog/CatalogListViewController.h

+ 823 - 0
RedAnt iShop/iShop.xcodeproj/project.pbxproj

@@ -0,0 +1,823 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 56;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		3C0E61132B8C743700510D99 /* DetailTopicCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C0E61122B8C743700510D99 /* DetailTopicCell.m */; };
+		3C2DA4A02B298794007721B9 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA49F2B298794007721B9 /* AppDelegate.m */; };
+		3C2DA4A32B298794007721B9 /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4A22B298794007721B9 /* SceneDelegate.m */; };
+		3C2DA4A92B298794007721B9 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3C2DA4A72B298794007721B9 /* Main.storyboard */; };
+		3C2DA4AB2B298796007721B9 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 3C2DA4AA2B298796007721B9 /* Assets.xcassets */; };
+		3C2DA4AE2B298796007721B9 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3C2DA4AC2B298796007721B9 /* LaunchScreen.storyboard */; };
+		3C2DA4B12B298796007721B9 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4B02B298796007721B9 /* main.m */; };
+		3C2DA4C62B2A9EF2007721B9 /* FrameRoot.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4C52B2A9EF2007721B9 /* FrameRoot.m */; };
+		3C2DA4C92B2AA86C007721B9 /* tab.json in Resources */ = {isa = PBXBuildFile; fileRef = 3C2DA4C82B2AA86C007721B9 /* tab.json */; };
+		3C2DA4CB2B2AA8B5007721B9 /* Frame.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3C2DA4CA2B2AA8B5007721B9 /* Frame.storyboard */; };
+		3C2DA4CE2B2AA905007721B9 /* HomeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4CD2B2AA905007721B9 /* HomeViewController.m */; };
+		3C2DA4D12B2AA91D007721B9 /* MyViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4D02B2AA91D007721B9 /* MyViewController.m */; };
+		3C2DA4D42B2AA953007721B9 /* CartViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4D32B2AA953007721B9 /* CartViewController.m */; };
+		3C2DA4DA2B2AAB15007721B9 /* RAUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4D82B2AAB15007721B9 /* RAUtils.m */; };
+		3C2DA4DD2B2AAB39007721B9 /* RAConvertor.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4DC2B2AAB39007721B9 /* RAConvertor.m */; };
+		3C2DA4E52B2AAB50007721B9 /* PopWaitAlert.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4E22B2AAB50007721B9 /* PopWaitAlert.m */; };
+		3C2DA4E62B2AAB50007721B9 /* MessageBox.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4E32B2AAB50007721B9 /* MessageBox.m */; };
+		3C2DA4E72B2AAB50007721B9 /* RAPopviewContainer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4E42B2AAB50007721B9 /* RAPopviewContainer.m */; };
+		3C2DA4EA2B2AF9BC007721B9 /* CatalogViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4E92B2AF9BC007721B9 /* CatalogViewController.m */; };
+		3C2DA4ED2B2AFA5C007721B9 /* LocalListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4EC2B2AFA5C007721B9 /* LocalListViewController.m */; };
+		3C2DA4F02B2AFBF4007721B9 /* TabViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA4EF2B2AFBF4007721B9 /* TabViewController.m */; };
+		3C2DA50A2B2BF03E007721B9 /* HWWeakTimer.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5022B2BF03E007721B9 /* HWWeakTimer.m */; };
+		3C2DA50B2B2BF03E007721B9 /* CycleScrollView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5042B2BF03E007721B9 /* CycleScrollView.m */; };
+		3C2DA50C2B2BF03E007721B9 /* SliderPage.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5052B2BF03E007721B9 /* SliderPage.m */; };
+		3C2DA50D2B2BF03E007721B9 /* NSTimer+Addition.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5072B2BF03E007721B9 /* NSTimer+Addition.m */; };
+		3C2DA5102B2BFE98007721B9 /* FileCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA50F2B2BFE98007721B9 /* FileCache.m */; };
+		3C2DA51D2B2C0226007721B9 /* HomeTableViewCellBanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5142B2C0226007721B9 /* HomeTableViewCellBanner.m */; };
+		3C2DA51E2B2C0226007721B9 /* HomeTableViewCellButtonBanner.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5152B2C0226007721B9 /* HomeTableViewCellButtonBanner.m */; };
+		3C2DA51F2B2C0226007721B9 /* HomeTableViewCellSlide.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5172B2C0226007721B9 /* HomeTableViewCellSlide.m */; };
+		3C2DA5272B2C4CCD007721B9 /* StrikethroughLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5252B2C4CCC007721B9 /* StrikethroughLabel.m */; };
+		3C2DA52B2B2C4D2C007721B9 /* CatalogModelDetailViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA52A2B2C4D2C007721B9 /* CatalogModelDetailViewController.m */; };
+		3C2DA52F2B301AB9007721B9 /* NetworkUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA52D2B301AB9007721B9 /* NetworkUtils.m */; };
+		3C2DA5352B301B1E007721B9 /* RANetworkTaskDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5342B301B1E007721B9 /* RANetworkTaskDelegate.m */; };
+		3C2DA5382B301B65007721B9 /* Reachability.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5372B301B65007721B9 /* Reachability.m */; };
+		3C2DA53B2B301C6E007721B9 /* RANetwork.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA53A2B301C6E007721B9 /* RANetwork.m */; };
+		3C2DA53E2B301D4E007721B9 /* RASingleton.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA53D2B301D4E007721B9 /* RASingleton.m */; };
+		3C2DA5422B3032C6007721B9 /* NotificationNameCenter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5412B3032C6007721B9 /* NotificationNameCenter.m */; };
+		3C2DA5452B313B77007721B9 /* ImageUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C2DA5442B313B77007721B9 /* ImageUtils.m */; };
+		3C7A15F52B58F7ED004112E9 /* CustomPresentationController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3C7A15F42B58F7ED004112E9 /* CustomPresentationController.m */; };
+		3CA12B4A2B5A67E4007362F6 /* LocalListCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CA12B492B5A67E4007362F6 /* LocalListCell.m */; };
+		3CA12B4D2B60FBFB007362F6 /* SearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CA12B4C2B60FBFB007362F6 /* SearchViewController.m */; };
+		3CC41D5E2B47F43D007EFF14 /* HomeTableViewCellTopic.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC41D5C2B47F43D007EFF14 /* HomeTableViewCellTopic.m */; };
+		3CC41D862B4D316D007EFF14 /* CycleScrollViewPlus.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC41D852B4D316D007EFF14 /* CycleScrollViewPlus.m */; };
+		3CC41D892B4FC2F5007EFF14 /* DetailSlideImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC41D882B4FC2F5007EFF14 /* DetailSlideImageCell.m */; };
+		3CC41D8C2B4FE50E007EFF14 /* DetailKVCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC41D8B2B4FE50E007EFF14 /* DetailKVCell.m */; };
+		3CC41D8F2B4FE53D007EFF14 /* LineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CC41D8D2B4FE53D007EFF14 /* LineView.m */; };
+		3CF439EA2B6797BA00555C19 /* ItemSearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF439E92B6797BA00555C19 /* ItemSearchViewController.m */; };
+		3CF439EC2B6797C700555C19 /* itemsearch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3CF439EB2B6797C700555C19 /* itemsearch.storyboard */; };
+		3CF439F12B6A2D4100555C19 /* wkweb.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3CF439EE2B6A2D4100555C19 /* wkweb.storyboard */; };
+		3CF439F22B6A2D4100555C19 /* WebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF439EF2B6A2D4100555C19 /* WebViewController.m */; };
+		3CF439F52B6A2FF700555C19 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 3CF439F42B6A2FF700555C19 /* WebKit.framework */; };
+		3CF76FE12B3AB2D400407702 /* catalog.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3CF76FE02B3AB2D400407702 /* catalog.storyboard */; };
+		3CF76FE42B3AB37200407702 /* CatalogListViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF76FE32B3AB37200407702 /* CatalogListViewController.m */; };
+		3CF76FE72B3BBC2300407702 /* CategoryHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF76FE62B3BBC2300407702 /* CategoryHeaderView.m */; };
+		3CF76FEA2B3E99BC00407702 /* CatalogCellSmall.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF76FE92B3E99BC00407702 /* CatalogCellSmall.m */; };
+		3CF76FED2B44005900407702 /* CatalogFilterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF76FEC2B44005900407702 /* CatalogFilterViewController.m */; };
+		3CF76FF02B46A0D800407702 /* EnumSelectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF76FEF2B46A0D800407702 /* EnumSelectViewController.m */; };
+		3CF76FF32B46A0EB00407702 /* EnumSelectorCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF76FF22B46A0EB00407702 /* EnumSelectorCell.m */; };
+		3CF76FF62B46A11600407702 /* RTLabel.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CF76FF52B46A11600407702 /* RTLabel.m */; };
+		3CF76FF82B46A17A00407702 /* CommonEditor.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3CF76FF72B46A17A00407702 /* CommonEditor.storyboard */; };
+		3CFBA8762B511FA0004F2D0D /* DetailBasicCell0.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CFBA8752B511FA0004F2D0D /* DetailBasicCell0.m */; };
+		3CFBA8792B5524B5004F2D0D /* NIDropDown.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CFBA8782B5524B4004F2D0D /* NIDropDown.m */; };
+		3CFBA87C2B5665CF004F2D0D /* ColorSelectViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CFBA87B2B5665CF004F2D0D /* ColorSelectViewController.m */; };
+		3CFBA87F2B56667F004F2D0D /* ColorSelectCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CFBA87E2B56667F004F2D0D /* ColorSelectCell.m */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		3C0E61112B8C743700510D99 /* DetailTopicCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailTopicCell.h; sourceTree = "<group>"; };
+		3C0E61122B8C743700510D99 /* DetailTopicCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailTopicCell.m; sourceTree = "<group>"; };
+		3C2DA49B2B298794007721B9 /* iShop.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = iShop.app; sourceTree = BUILT_PRODUCTS_DIR; };
+		3C2DA49E2B298794007721B9 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+		3C2DA49F2B298794007721B9 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+		3C2DA4A12B298794007721B9 /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = "<group>"; };
+		3C2DA4A22B298794007721B9 /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = "<group>"; };
+		3C2DA4A82B298794007721B9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+		3C2DA4AA2B298796007721B9 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+		3C2DA4AD2B298796007721B9 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+		3C2DA4AF2B298796007721B9 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+		3C2DA4B02B298796007721B9 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+		3C2DA4C42B2A9EF2007721B9 /* FrameRoot.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FrameRoot.h; sourceTree = "<group>"; };
+		3C2DA4C52B2A9EF2007721B9 /* FrameRoot.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = FrameRoot.m; sourceTree = "<group>"; };
+		3C2DA4C82B2AA86C007721B9 /* tab.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = tab.json; sourceTree = "<group>"; };
+		3C2DA4CA2B2AA8B5007721B9 /* Frame.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Frame.storyboard; sourceTree = "<group>"; };
+		3C2DA4CC2B2AA905007721B9 /* HomeViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HomeViewController.h; sourceTree = "<group>"; };
+		3C2DA4CD2B2AA905007721B9 /* HomeViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HomeViewController.m; sourceTree = "<group>"; };
+		3C2DA4CF2B2AA91D007721B9 /* MyViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MyViewController.h; sourceTree = "<group>"; };
+		3C2DA4D02B2AA91D007721B9 /* MyViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MyViewController.m; sourceTree = "<group>"; };
+		3C2DA4D22B2AA953007721B9 /* CartViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CartViewController.h; sourceTree = "<group>"; };
+		3C2DA4D32B2AA953007721B9 /* CartViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CartViewController.m; sourceTree = "<group>"; };
+		3C2DA4D52B2AAAAB007721B9 /* const.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = const.h; sourceTree = "<group>"; };
+		3C2DA4D62B2AAABC007721B9 /* config.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
+		3C2DA4D82B2AAB15007721B9 /* RAUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RAUtils.m; path = ../../../common/RAUtils.m; sourceTree = "<group>"; };
+		3C2DA4D92B2AAB15007721B9 /* RAUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RAUtils.h; path = ../../../common/RAUtils.h; sourceTree = "<group>"; };
+		3C2DA4DB2B2AAB38007721B9 /* RAConvertor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RAConvertor.h; path = ../../../common/RAConvertor.h; sourceTree = "<group>"; };
+		3C2DA4DC2B2AAB39007721B9 /* RAConvertor.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RAConvertor.m; path = ../../../common/RAConvertor.m; sourceTree = "<group>"; };
+		3C2DA4DF2B2AAB50007721B9 /* MessageBox.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MessageBox.h; sourceTree = "<group>"; };
+		3C2DA4E02B2AAB50007721B9 /* PopWaitAlert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PopWaitAlert.h; sourceTree = "<group>"; };
+		3C2DA4E12B2AAB50007721B9 /* RAPopviewContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RAPopviewContainer.h; sourceTree = "<group>"; };
+		3C2DA4E22B2AAB50007721B9 /* PopWaitAlert.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PopWaitAlert.m; sourceTree = "<group>"; };
+		3C2DA4E32B2AAB50007721B9 /* MessageBox.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MessageBox.m; sourceTree = "<group>"; };
+		3C2DA4E42B2AAB50007721B9 /* RAPopviewContainer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RAPopviewContainer.m; sourceTree = "<group>"; };
+		3C2DA4E82B2AF9BC007721B9 /* CatalogViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogViewController.h; sourceTree = "<group>"; };
+		3C2DA4E92B2AF9BC007721B9 /* CatalogViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CatalogViewController.m; sourceTree = "<group>"; };
+		3C2DA4EB2B2AFA5C007721B9 /* LocalListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LocalListViewController.h; sourceTree = "<group>"; };
+		3C2DA4EC2B2AFA5C007721B9 /* LocalListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LocalListViewController.m; sourceTree = "<group>"; };
+		3C2DA4EE2B2AFBF4007721B9 /* TabViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TabViewController.h; sourceTree = "<group>"; };
+		3C2DA4EF2B2AFBF4007721B9 /* TabViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TabViewController.m; sourceTree = "<group>"; };
+		3C2DA5022B2BF03E007721B9 /* HWWeakTimer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HWWeakTimer.m; sourceTree = "<group>"; };
+		3C2DA5032B2BF03E007721B9 /* NSTimer+Addition.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSTimer+Addition.h"; sourceTree = "<group>"; };
+		3C2DA5042B2BF03E007721B9 /* CycleScrollView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CycleScrollView.m; sourceTree = "<group>"; };
+		3C2DA5052B2BF03E007721B9 /* SliderPage.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SliderPage.m; sourceTree = "<group>"; };
+		3C2DA5062B2BF03E007721B9 /* HWWeakTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HWWeakTimer.h; sourceTree = "<group>"; };
+		3C2DA5072B2BF03E007721B9 /* NSTimer+Addition.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSTimer+Addition.m"; sourceTree = "<group>"; };
+		3C2DA5082B2BF03E007721B9 /* SliderPage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SliderPage.h; sourceTree = "<group>"; };
+		3C2DA5092B2BF03E007721B9 /* CycleScrollView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CycleScrollView.h; sourceTree = "<group>"; };
+		3C2DA50E2B2BFE98007721B9 /* FileCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = FileCache.h; path = ../../../common/FileCache.h; sourceTree = "<group>"; };
+		3C2DA50F2B2BFE98007721B9 /* FileCache.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = FileCache.m; path = ../../../common/FileCache.m; sourceTree = "<group>"; };
+		3C2DA5122B2C0226007721B9 /* HomeTableViewCellSlide.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeTableViewCellSlide.h; sourceTree = "<group>"; };
+		3C2DA5142B2C0226007721B9 /* HomeTableViewCellBanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeTableViewCellBanner.m; sourceTree = "<group>"; };
+		3C2DA5152B2C0226007721B9 /* HomeTableViewCellButtonBanner.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeTableViewCellButtonBanner.m; sourceTree = "<group>"; };
+		3C2DA5172B2C0226007721B9 /* HomeTableViewCellSlide.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeTableViewCellSlide.m; sourceTree = "<group>"; };
+		3C2DA5182B2C0226007721B9 /* HomeTableViewCellBanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeTableViewCellBanner.h; sourceTree = "<group>"; };
+		3C2DA51B2B2C0226007721B9 /* HomeTableViewCellButtonBanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeTableViewCellButtonBanner.h; sourceTree = "<group>"; };
+		3C2DA5252B2C4CCC007721B9 /* StrikethroughLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = StrikethroughLabel.m; path = ../../../common/customUI/StrikethroughLabel.m; sourceTree = "<group>"; };
+		3C2DA5262B2C4CCD007721B9 /* StrikethroughLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StrikethroughLabel.h; path = ../../../common/customUI/StrikethroughLabel.h; sourceTree = "<group>"; };
+		3C2DA5292B2C4D2C007721B9 /* CatalogModelDetailViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogModelDetailViewController.h; sourceTree = "<group>"; };
+		3C2DA52A2B2C4D2C007721B9 /* CatalogModelDetailViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CatalogModelDetailViewController.m; sourceTree = "<group>"; };
+		3C2DA52D2B301AB9007721B9 /* NetworkUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NetworkUtils.m; path = ../../../common/NetworkUtils.m; sourceTree = "<group>"; };
+		3C2DA52E2B301AB9007721B9 /* NetworkUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NetworkUtils.h; path = ../../../common/NetworkUtils.h; sourceTree = "<group>"; };
+		3C2DA5332B301B1E007721B9 /* RANetworkTaskDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RANetworkTaskDelegate.h; path = ../../../common/upload/RANetworkTaskDelegate.h; sourceTree = "<group>"; };
+		3C2DA5342B301B1E007721B9 /* RANetworkTaskDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RANetworkTaskDelegate.m; path = ../../../common/upload/RANetworkTaskDelegate.m; sourceTree = "<group>"; };
+		3C2DA5362B301B65007721B9 /* Reachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Reachability.h; path = "../../../RedAnt ERP Mobile/common/Reachability.h"; sourceTree = "<group>"; };
+		3C2DA5372B301B65007721B9 /* Reachability.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Reachability.m; path = "../../../RedAnt ERP Mobile/common/Reachability.m"; sourceTree = "<group>"; };
+		3C2DA5392B301C6E007721B9 /* RANetwork.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RANetwork.h; sourceTree = "<group>"; };
+		3C2DA53A2B301C6E007721B9 /* RANetwork.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RANetwork.m; sourceTree = "<group>"; };
+		3C2DA53C2B301D4E007721B9 /* RASingleton.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RASingleton.h; sourceTree = "<group>"; };
+		3C2DA53D2B301D4E007721B9 /* RASingleton.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RASingleton.m; sourceTree = "<group>"; };
+		3C2DA5402B3032C6007721B9 /* NotificationNameCenter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NotificationNameCenter.h; path = "../../../RedAnt ERP Mobile/common/NotificationNameCenter.h"; sourceTree = "<group>"; };
+		3C2DA5412B3032C6007721B9 /* NotificationNameCenter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NotificationNameCenter.m; path = "../../../RedAnt ERP Mobile/common/NotificationNameCenter.m"; sourceTree = "<group>"; };
+		3C2DA5432B313B77007721B9 /* ImageUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ImageUtils.h; path = "../../../RedAnt ERP Mobile/common/ImageUtils.h"; sourceTree = "<group>"; };
+		3C2DA5442B313B77007721B9 /* ImageUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ImageUtils.m; path = "../../../RedAnt ERP Mobile/common/ImageUtils.m"; sourceTree = "<group>"; };
+		3C7A15F32B58F7ED004112E9 /* CustomPresentationController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CustomPresentationController.h; sourceTree = "<group>"; };
+		3C7A15F42B58F7ED004112E9 /* CustomPresentationController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CustomPresentationController.m; sourceTree = "<group>"; };
+		3CA12B482B5A67E4007362F6 /* LocalListCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LocalListCell.h; sourceTree = "<group>"; };
+		3CA12B492B5A67E4007362F6 /* LocalListCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LocalListCell.m; sourceTree = "<group>"; };
+		3CA12B4B2B60FBFB007362F6 /* SearchViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SearchViewController.h; sourceTree = "<group>"; };
+		3CA12B4C2B60FBFB007362F6 /* SearchViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SearchViewController.m; sourceTree = "<group>"; };
+		3CC41D5C2B47F43D007EFF14 /* HomeTableViewCellTopic.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HomeTableViewCellTopic.m; sourceTree = "<group>"; };
+		3CC41D5D2B47F43D007EFF14 /* HomeTableViewCellTopic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HomeTableViewCellTopic.h; sourceTree = "<group>"; };
+		3CC41D842B4D316D007EFF14 /* CycleScrollViewPlus.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CycleScrollViewPlus.h; sourceTree = "<group>"; };
+		3CC41D852B4D316D007EFF14 /* CycleScrollViewPlus.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CycleScrollViewPlus.m; sourceTree = "<group>"; };
+		3CC41D872B4FC2F5007EFF14 /* DetailSlideImageCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailSlideImageCell.h; sourceTree = "<group>"; };
+		3CC41D882B4FC2F5007EFF14 /* DetailSlideImageCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailSlideImageCell.m; sourceTree = "<group>"; };
+		3CC41D8A2B4FE50D007EFF14 /* DetailKVCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DetailKVCell.h; path = "../../../RedAnt ERP Mobile/common/Functions/modelDetail/DetailKVCell.h"; sourceTree = "<group>"; };
+		3CC41D8B2B4FE50E007EFF14 /* DetailKVCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DetailKVCell.m; path = "../../../RedAnt ERP Mobile/common/Functions/modelDetail/DetailKVCell.m"; sourceTree = "<group>"; };
+		3CC41D8D2B4FE53D007EFF14 /* LineView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LineView.m; path = "../../../RedAnt ERP Mobile/common/Functions/modelDetail/LineView.m"; sourceTree = "<group>"; };
+		3CC41D8E2B4FE53D007EFF14 /* LineView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LineView.h; path = "../../../RedAnt ERP Mobile/common/Functions/modelDetail/LineView.h"; sourceTree = "<group>"; };
+		3CF439E82B6797BA00555C19 /* ItemSearchViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ItemSearchViewController.h; sourceTree = "<group>"; };
+		3CF439E92B6797BA00555C19 /* ItemSearchViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ItemSearchViewController.m; sourceTree = "<group>"; };
+		3CF439EB2B6797C700555C19 /* itemsearch.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = itemsearch.storyboard; sourceTree = "<group>"; };
+		3CF439EE2B6A2D4100555C19 /* wkweb.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = wkweb.storyboard; path = "../../../../common/WK PDF+Web/wkweb.storyboard"; sourceTree = "<group>"; };
+		3CF439EF2B6A2D4100555C19 /* WebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = WebViewController.m; path = "../../../../common/WK PDF+Web/WebViewController.m"; sourceTree = "<group>"; };
+		3CF439F02B6A2D4100555C19 /* WebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = WebViewController.h; path = "../../../../common/WK PDF+Web/WebViewController.h"; sourceTree = "<group>"; };
+		3CF439F42B6A2FF700555C19 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
+		3CF76FE02B3AB2D400407702 /* catalog.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = catalog.storyboard; sourceTree = "<group>"; };
+		3CF76FE22B3AB37200407702 /* CatalogListViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogListViewController.h; sourceTree = "<group>"; };
+		3CF76FE32B3AB37200407702 /* CatalogListViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CatalogListViewController.m; sourceTree = "<group>"; };
+		3CF76FE52B3BBC2300407702 /* CategoryHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CategoryHeaderView.h; sourceTree = "<group>"; };
+		3CF76FE62B3BBC2300407702 /* CategoryHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CategoryHeaderView.m; sourceTree = "<group>"; };
+		3CF76FE82B3E99BC00407702 /* CatalogCellSmall.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogCellSmall.h; sourceTree = "<group>"; };
+		3CF76FE92B3E99BC00407702 /* CatalogCellSmall.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CatalogCellSmall.m; sourceTree = "<group>"; };
+		3CF76FEB2B44005900407702 /* CatalogFilterViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CatalogFilterViewController.h; sourceTree = "<group>"; };
+		3CF76FEC2B44005900407702 /* CatalogFilterViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CatalogFilterViewController.m; sourceTree = "<group>"; };
+		3CF76FEE2B46A0D800407702 /* EnumSelectViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EnumSelectViewController.h; path = ../../../common/customUI/commoneditor/EnumSelectViewController.h; sourceTree = "<group>"; };
+		3CF76FEF2B46A0D800407702 /* EnumSelectViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EnumSelectViewController.m; path = ../../../common/customUI/commoneditor/EnumSelectViewController.m; sourceTree = "<group>"; };
+		3CF76FF12B46A0EB00407702 /* EnumSelectorCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EnumSelectorCell.h; path = ../../../common/customUI/commoneditor/EnumSelectorCell.h; sourceTree = "<group>"; };
+		3CF76FF22B46A0EB00407702 /* EnumSelectorCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EnumSelectorCell.m; path = ../../../common/customUI/commoneditor/EnumSelectorCell.m; sourceTree = "<group>"; };
+		3CF76FF42B46A11600407702 /* RTLabel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = RTLabel.h; path = ../../../common/customUI/RTLabel.h; sourceTree = "<group>"; };
+		3CF76FF52B46A11600407702 /* RTLabel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = RTLabel.m; path = ../../../common/customUI/RTLabel.m; sourceTree = "<group>"; };
+		3CF76FF72B46A17A00407702 /* CommonEditor.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = CommonEditor.storyboard; path = ../../../common/customUI/commoneditor/CommonEditor.storyboard; sourceTree = "<group>"; };
+		3CFBA8742B511FA0004F2D0D /* DetailBasicCell0.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = DetailBasicCell0.h; sourceTree = "<group>"; };
+		3CFBA8752B511FA0004F2D0D /* DetailBasicCell0.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = DetailBasicCell0.m; sourceTree = "<group>"; };
+		3CFBA8772B5524B4004F2D0D /* NIDropDown.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = NIDropDown.h; path = "../../../RedAnt ERP Mobile/common/customUI/NIDropDown.h"; sourceTree = "<group>"; };
+		3CFBA8782B5524B4004F2D0D /* NIDropDown.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = NIDropDown.m; path = "../../../RedAnt ERP Mobile/common/customUI/NIDropDown.m"; sourceTree = "<group>"; };
+		3CFBA87A2B5665CF004F2D0D /* ColorSelectViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ColorSelectViewController.h; sourceTree = "<group>"; };
+		3CFBA87B2B5665CF004F2D0D /* ColorSelectViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ColorSelectViewController.m; sourceTree = "<group>"; };
+		3CFBA87D2B56667F004F2D0D /* ColorSelectCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ColorSelectCell.h; sourceTree = "<group>"; };
+		3CFBA87E2B56667F004F2D0D /* ColorSelectCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ColorSelectCell.m; sourceTree = "<group>"; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		3C2DA4982B298794007721B9 /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3CF439F52B6A2FF700555C19 /* WebKit.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		3C2DA4922B298794007721B9 = {
+			isa = PBXGroup;
+			children = (
+				3C2DA49D2B298794007721B9 /* iShop */,
+				3C2DA49C2B298794007721B9 /* Products */,
+				3CF439F32B6A2FF600555C19 /* Frameworks */,
+			);
+			sourceTree = "<group>";
+		};
+		3C2DA49C2B298794007721B9 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				3C2DA49B2B298794007721B9 /* iShop.app */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		3C2DA49D2B298794007721B9 /* iShop */ = {
+			isa = PBXGroup;
+			children = (
+				3CC41D5D2B47F43D007EFF14 /* HomeTableViewCellTopic.h */,
+				3CC41D5C2B47F43D007EFF14 /* HomeTableViewCellTopic.m */,
+				3C2DA53F2B3032AC007721B9 /* notification */,
+				3C2DA52C2B301983007721B9 /* network */,
+				3C2DA5282B2C4D0A007721B9 /* detail */,
+				3C2DA5012B2BF03E007721B9 /* AutoScrollImage */,
+				3C2DA4D72B2AAB01007721B9 /* utils */,
+				3C2DA4C72B2AA84B007721B9 /* RootFrame */,
+				3C2DA49E2B298794007721B9 /* AppDelegate.h */,
+				3C2DA49F2B298794007721B9 /* AppDelegate.m */,
+				3C2DA4A12B298794007721B9 /* SceneDelegate.h */,
+				3C2DA4A22B298794007721B9 /* SceneDelegate.m */,
+				3C2DA4A72B298794007721B9 /* Main.storyboard */,
+				3C2DA4AA2B298796007721B9 /* Assets.xcassets */,
+				3C2DA4AC2B298796007721B9 /* LaunchScreen.storyboard */,
+				3C2DA4AF2B298796007721B9 /* Info.plist */,
+				3C2DA4B02B298796007721B9 /* main.m */,
+				3C2DA4D52B2AAAAB007721B9 /* const.h */,
+				3C2DA4D62B2AAABC007721B9 /* config.h */,
+				3C2DA53C2B301D4E007721B9 /* RASingleton.h */,
+				3C2DA53D2B301D4E007721B9 /* RASingleton.m */,
+			);
+			path = iShop;
+			sourceTree = "<group>";
+		};
+		3C2DA4C72B2AA84B007721B9 /* RootFrame */ = {
+			isa = PBXGroup;
+			children = (
+				3CF439E72B67979800555C19 /* itemsearch */,
+				3C7A15F62B5A63E7004112E9 /* locallist */,
+				3C2DA5212B2C4C88007721B9 /* catalog */,
+				3C2DA5112B2C0226007721B9 /* home */,
+				3C2DA4C42B2A9EF2007721B9 /* FrameRoot.h */,
+				3C2DA4C52B2A9EF2007721B9 /* FrameRoot.m */,
+				3C2DA4C82B2AA86C007721B9 /* tab.json */,
+				3C2DA4CA2B2AA8B5007721B9 /* Frame.storyboard */,
+				3C2DA4CC2B2AA905007721B9 /* HomeViewController.h */,
+				3C2DA4CD2B2AA905007721B9 /* HomeViewController.m */,
+				3C2DA4CF2B2AA91D007721B9 /* MyViewController.h */,
+				3C2DA4D02B2AA91D007721B9 /* MyViewController.m */,
+				3C2DA4D22B2AA953007721B9 /* CartViewController.h */,
+				3C2DA4D32B2AA953007721B9 /* CartViewController.m */,
+				3C2DA4E82B2AF9BC007721B9 /* CatalogViewController.h */,
+				3C2DA4E92B2AF9BC007721B9 /* CatalogViewController.m */,
+				3C2DA4EE2B2AFBF4007721B9 /* TabViewController.h */,
+				3C2DA4EF2B2AFBF4007721B9 /* TabViewController.m */,
+				3CA12B4B2B60FBFB007362F6 /* SearchViewController.h */,
+				3CA12B4C2B60FBFB007362F6 /* SearchViewController.m */,
+			);
+			path = RootFrame;
+			sourceTree = "<group>";
+		};
+		3C2DA4D72B2AAB01007721B9 /* utils */ = {
+			isa = PBXGroup;
+			children = (
+				3CF439ED2B6A2D2200555C19 /* webview */,
+				3CFBA8772B5524B4004F2D0D /* NIDropDown.h */,
+				3CFBA8782B5524B4004F2D0D /* NIDropDown.m */,
+				3CF76FF72B46A17A00407702 /* CommonEditor.storyboard */,
+				3CC41D8E2B4FE53D007EFF14 /* LineView.h */,
+				3CC41D8D2B4FE53D007EFF14 /* LineView.m */,
+				3CF76FF42B46A11600407702 /* RTLabel.h */,
+				3CF76FF52B46A11600407702 /* RTLabel.m */,
+				3CF76FF12B46A0EB00407702 /* EnumSelectorCell.h */,
+				3CF76FF22B46A0EB00407702 /* EnumSelectorCell.m */,
+				3CF76FEE2B46A0D800407702 /* EnumSelectViewController.h */,
+				3CF76FEF2B46A0D800407702 /* EnumSelectViewController.m */,
+				3C2DA5432B313B77007721B9 /* ImageUtils.h */,
+				3C2DA5442B313B77007721B9 /* ImageUtils.m */,
+				3C2DA5262B2C4CCD007721B9 /* StrikethroughLabel.h */,
+				3C2DA5252B2C4CCC007721B9 /* StrikethroughLabel.m */,
+				3C2DA50E2B2BFE98007721B9 /* FileCache.h */,
+				3C2DA50F2B2BFE98007721B9 /* FileCache.m */,
+				3C2DA4DE2B2AAB50007721B9 /* MessageBox */,
+				3C2DA4DB2B2AAB38007721B9 /* RAConvertor.h */,
+				3C2DA4DC2B2AAB39007721B9 /* RAConvertor.m */,
+				3C2DA4D92B2AAB15007721B9 /* RAUtils.h */,
+				3C2DA4D82B2AAB15007721B9 /* RAUtils.m */,
+			);
+			path = utils;
+			sourceTree = "<group>";
+		};
+		3C2DA4DE2B2AAB50007721B9 /* MessageBox */ = {
+			isa = PBXGroup;
+			children = (
+				3C2DA4DF2B2AAB50007721B9 /* MessageBox.h */,
+				3C2DA4E02B2AAB50007721B9 /* PopWaitAlert.h */,
+				3C2DA4E12B2AAB50007721B9 /* RAPopviewContainer.h */,
+				3C2DA4E22B2AAB50007721B9 /* PopWaitAlert.m */,
+				3C2DA4E32B2AAB50007721B9 /* MessageBox.m */,
+				3C2DA4E42B2AAB50007721B9 /* RAPopviewContainer.m */,
+			);
+			name = MessageBox;
+			path = ../../../common/MessageBox;
+			sourceTree = "<group>";
+		};
+		3C2DA5012B2BF03E007721B9 /* AutoScrollImage */ = {
+			isa = PBXGroup;
+			children = (
+				3C2DA5022B2BF03E007721B9 /* HWWeakTimer.m */,
+				3C2DA5032B2BF03E007721B9 /* NSTimer+Addition.h */,
+				3C2DA5042B2BF03E007721B9 /* CycleScrollView.m */,
+				3C2DA5052B2BF03E007721B9 /* SliderPage.m */,
+				3C2DA5062B2BF03E007721B9 /* HWWeakTimer.h */,
+				3C2DA5072B2BF03E007721B9 /* NSTimer+Addition.m */,
+				3C2DA5082B2BF03E007721B9 /* SliderPage.h */,
+				3C2DA5092B2BF03E007721B9 /* CycleScrollView.h */,
+				3CC41D842B4D316D007EFF14 /* CycleScrollViewPlus.h */,
+				3CC41D852B4D316D007EFF14 /* CycleScrollViewPlus.m */,
+			);
+			name = AutoScrollImage;
+			path = "../../RedAnt ERP Mobile/common/AutoScrollImage";
+			sourceTree = "<group>";
+		};
+		3C2DA5112B2C0226007721B9 /* home */ = {
+			isa = PBXGroup;
+			children = (
+				3C2DA5122B2C0226007721B9 /* HomeTableViewCellSlide.h */,
+				3C2DA5142B2C0226007721B9 /* HomeTableViewCellBanner.m */,
+				3C2DA5152B2C0226007721B9 /* HomeTableViewCellButtonBanner.m */,
+				3C2DA5172B2C0226007721B9 /* HomeTableViewCellSlide.m */,
+				3C2DA5182B2C0226007721B9 /* HomeTableViewCellBanner.h */,
+				3C2DA51B2B2C0226007721B9 /* HomeTableViewCellButtonBanner.h */,
+			);
+			name = home;
+			path = "../../../RedAnt ERP Mobile/common/Functions/home";
+			sourceTree = "<group>";
+		};
+		3C2DA5212B2C4C88007721B9 /* catalog */ = {
+			isa = PBXGroup;
+			children = (
+				3CF76FE02B3AB2D400407702 /* catalog.storyboard */,
+				3CF76FE22B3AB37200407702 /* CatalogListViewController.h */,
+				3CF76FE32B3AB37200407702 /* CatalogListViewController.m */,
+				3CF76FE52B3BBC2300407702 /* CategoryHeaderView.h */,
+				3CF76FE62B3BBC2300407702 /* CategoryHeaderView.m */,
+				3CF76FE82B3E99BC00407702 /* CatalogCellSmall.h */,
+				3CF76FE92B3E99BC00407702 /* CatalogCellSmall.m */,
+				3CF76FEB2B44005900407702 /* CatalogFilterViewController.h */,
+				3CF76FEC2B44005900407702 /* CatalogFilterViewController.m */,
+			);
+			path = catalog;
+			sourceTree = "<group>";
+		};
+		3C2DA5282B2C4D0A007721B9 /* detail */ = {
+			isa = PBXGroup;
+			children = (
+				3C7A15F32B58F7ED004112E9 /* CustomPresentationController.h */,
+				3C7A15F42B58F7ED004112E9 /* CustomPresentationController.m */,
+				3C2DA5292B2C4D2C007721B9 /* CatalogModelDetailViewController.h */,
+				3C2DA52A2B2C4D2C007721B9 /* CatalogModelDetailViewController.m */,
+				3CC41D872B4FC2F5007EFF14 /* DetailSlideImageCell.h */,
+				3CC41D882B4FC2F5007EFF14 /* DetailSlideImageCell.m */,
+				3CC41D8A2B4FE50D007EFF14 /* DetailKVCell.h */,
+				3CC41D8B2B4FE50E007EFF14 /* DetailKVCell.m */,
+				3CFBA8742B511FA0004F2D0D /* DetailBasicCell0.h */,
+				3CFBA8752B511FA0004F2D0D /* DetailBasicCell0.m */,
+				3CFBA87A2B5665CF004F2D0D /* ColorSelectViewController.h */,
+				3CFBA87B2B5665CF004F2D0D /* ColorSelectViewController.m */,
+				3CFBA87D2B56667F004F2D0D /* ColorSelectCell.h */,
+				3CFBA87E2B56667F004F2D0D /* ColorSelectCell.m */,
+				3C0E61112B8C743700510D99 /* DetailTopicCell.h */,
+				3C0E61122B8C743700510D99 /* DetailTopicCell.m */,
+			);
+			path = detail;
+			sourceTree = "<group>";
+		};
+		3C2DA52C2B301983007721B9 /* network */ = {
+			isa = PBXGroup;
+			children = (
+				3C2DA5362B301B65007721B9 /* Reachability.h */,
+				3C2DA5372B301B65007721B9 /* Reachability.m */,
+				3C2DA52E2B301AB9007721B9 /* NetworkUtils.h */,
+				3C2DA52D2B301AB9007721B9 /* NetworkUtils.m */,
+				3C2DA5332B301B1E007721B9 /* RANetworkTaskDelegate.h */,
+				3C2DA5342B301B1E007721B9 /* RANetworkTaskDelegate.m */,
+				3C2DA5392B301C6E007721B9 /* RANetwork.h */,
+				3C2DA53A2B301C6E007721B9 /* RANetwork.m */,
+			);
+			path = network;
+			sourceTree = "<group>";
+		};
+		3C2DA53F2B3032AC007721B9 /* notification */ = {
+			isa = PBXGroup;
+			children = (
+				3C2DA5402B3032C6007721B9 /* NotificationNameCenter.h */,
+				3C2DA5412B3032C6007721B9 /* NotificationNameCenter.m */,
+			);
+			path = notification;
+			sourceTree = "<group>";
+		};
+		3C7A15F62B5A63E7004112E9 /* locallist */ = {
+			isa = PBXGroup;
+			children = (
+				3C2DA4EB2B2AFA5C007721B9 /* LocalListViewController.h */,
+				3C2DA4EC2B2AFA5C007721B9 /* LocalListViewController.m */,
+				3CA12B482B5A67E4007362F6 /* LocalListCell.h */,
+				3CA12B492B5A67E4007362F6 /* LocalListCell.m */,
+			);
+			path = locallist;
+			sourceTree = "<group>";
+		};
+		3CF439E72B67979800555C19 /* itemsearch */ = {
+			isa = PBXGroup;
+			children = (
+				3CF439E82B6797BA00555C19 /* ItemSearchViewController.h */,
+				3CF439E92B6797BA00555C19 /* ItemSearchViewController.m */,
+				3CF439EB2B6797C700555C19 /* itemsearch.storyboard */,
+			);
+			path = itemsearch;
+			sourceTree = "<group>";
+		};
+		3CF439ED2B6A2D2200555C19 /* webview */ = {
+			isa = PBXGroup;
+			children = (
+				3CF439F02B6A2D4100555C19 /* WebViewController.h */,
+				3CF439EF2B6A2D4100555C19 /* WebViewController.m */,
+				3CF439EE2B6A2D4100555C19 /* wkweb.storyboard */,
+			);
+			path = webview;
+			sourceTree = "<group>";
+		};
+		3CF439F32B6A2FF600555C19 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				3CF439F42B6A2FF700555C19 /* WebKit.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+		3C2DA49A2B298794007721B9 /* iShop */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 3C2DA4B42B298796007721B9 /* Build configuration list for PBXNativeTarget "iShop" */;
+			buildPhases = (
+				3C2DA4972B298794007721B9 /* Sources */,
+				3C2DA4982B298794007721B9 /* Frameworks */,
+				3C2DA4992B298794007721B9 /* Resources */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = iShop;
+			productName = iShop;
+			productReference = 3C2DA49B2B298794007721B9 /* iShop.app */;
+			productType = "com.apple.product-type.application";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		3C2DA4932B298794007721B9 /* Project object */ = {
+			isa = PBXProject;
+			attributes = {
+				BuildIndependentTargetsInParallel = 1;
+				LastUpgradeCheck = 1500;
+				TargetAttributes = {
+					3C2DA49A2B298794007721B9 = {
+						CreatedOnToolsVersion = 15.0.1;
+					};
+				};
+			};
+			buildConfigurationList = 3C2DA4962B298794007721B9 /* Build configuration list for PBXProject "iShop" */;
+			compatibilityVersion = "Xcode 14.0";
+			developmentRegion = en;
+			hasScannedForEncodings = 0;
+			knownRegions = (
+				en,
+				Base,
+			);
+			mainGroup = 3C2DA4922B298794007721B9;
+			productRefGroup = 3C2DA49C2B298794007721B9 /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				3C2DA49A2B298794007721B9 /* iShop */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+		3C2DA4992B298794007721B9 /* Resources */ = {
+			isa = PBXResourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3CF76FE12B3AB2D400407702 /* catalog.storyboard in Resources */,
+				3CF439EC2B6797C700555C19 /* itemsearch.storyboard in Resources */,
+				3C2DA4AE2B298796007721B9 /* LaunchScreen.storyboard in Resources */,
+				3C2DA4CB2B2AA8B5007721B9 /* Frame.storyboard in Resources */,
+				3CF76FF82B46A17A00407702 /* CommonEditor.storyboard in Resources */,
+				3CF439F12B6A2D4100555C19 /* wkweb.storyboard in Resources */,
+				3C2DA4AB2B298796007721B9 /* Assets.xcassets in Resources */,
+				3C2DA4A92B298794007721B9 /* Main.storyboard in Resources */,
+				3C2DA4C92B2AA86C007721B9 /* tab.json in Resources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+		3C2DA4972B298794007721B9 /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				3C2DA4ED2B2AFA5C007721B9 /* LocalListViewController.m in Sources */,
+				3CF76FE72B3BBC2300407702 /* CategoryHeaderView.m in Sources */,
+				3C2DA4E52B2AAB50007721B9 /* PopWaitAlert.m in Sources */,
+				3CF76FE42B3AB37200407702 /* CatalogListViewController.m in Sources */,
+				3C2DA52B2B2C4D2C007721B9 /* CatalogModelDetailViewController.m in Sources */,
+				3C2DA5452B313B77007721B9 /* ImageUtils.m in Sources */,
+				3C2DA4D42B2AA953007721B9 /* CartViewController.m in Sources */,
+				3CF76FED2B44005900407702 /* CatalogFilterViewController.m in Sources */,
+				3C2DA53B2B301C6E007721B9 /* RANetwork.m in Sources */,
+				3C2DA4A02B298794007721B9 /* AppDelegate.m in Sources */,
+				3CF76FF62B46A11600407702 /* RTLabel.m in Sources */,
+				3CFBA87F2B56667F004F2D0D /* ColorSelectCell.m in Sources */,
+				3C2DA50A2B2BF03E007721B9 /* HWWeakTimer.m in Sources */,
+				3CA12B4A2B5A67E4007362F6 /* LocalListCell.m in Sources */,
+				3C2DA51E2B2C0226007721B9 /* HomeTableViewCellButtonBanner.m in Sources */,
+				3C2DA52F2B301AB9007721B9 /* NetworkUtils.m in Sources */,
+				3C2DA4F02B2AFBF4007721B9 /* TabViewController.m in Sources */,
+				3C2DA5382B301B65007721B9 /* Reachability.m in Sources */,
+				3C0E61132B8C743700510D99 /* DetailTopicCell.m in Sources */,
+				3CF76FF32B46A0EB00407702 /* EnumSelectorCell.m in Sources */,
+				3C2DA51F2B2C0226007721B9 /* HomeTableViewCellSlide.m in Sources */,
+				3C2DA5102B2BFE98007721B9 /* FileCache.m in Sources */,
+				3CF76FEA2B3E99BC00407702 /* CatalogCellSmall.m in Sources */,
+				3CA12B4D2B60FBFB007362F6 /* SearchViewController.m in Sources */,
+				3CFBA87C2B5665CF004F2D0D /* ColorSelectViewController.m in Sources */,
+				3C2DA53E2B301D4E007721B9 /* RASingleton.m in Sources */,
+				3CF439F22B6A2D4100555C19 /* WebViewController.m in Sources */,
+				3C2DA51D2B2C0226007721B9 /* HomeTableViewCellBanner.m in Sources */,
+				3CC41D862B4D316D007EFF14 /* CycleScrollViewPlus.m in Sources */,
+				3C2DA5352B301B1E007721B9 /* RANetworkTaskDelegate.m in Sources */,
+				3C2DA50D2B2BF03E007721B9 /* NSTimer+Addition.m in Sources */,
+				3CFBA8792B5524B5004F2D0D /* NIDropDown.m in Sources */,
+				3CC41D8C2B4FE50E007EFF14 /* DetailKVCell.m in Sources */,
+				3CF76FF02B46A0D800407702 /* EnumSelectViewController.m in Sources */,
+				3C2DA4B12B298796007721B9 /* main.m in Sources */,
+				3C2DA5272B2C4CCD007721B9 /* StrikethroughLabel.m in Sources */,
+				3C2DA5422B3032C6007721B9 /* NotificationNameCenter.m in Sources */,
+				3C2DA4C62B2A9EF2007721B9 /* FrameRoot.m in Sources */,
+				3C2DA4A32B298794007721B9 /* SceneDelegate.m in Sources */,
+				3CFBA8762B511FA0004F2D0D /* DetailBasicCell0.m in Sources */,
+				3CC41D8F2B4FE53D007EFF14 /* LineView.m in Sources */,
+				3CC41D5E2B47F43D007EFF14 /* HomeTableViewCellTopic.m in Sources */,
+				3C2DA4DA2B2AAB15007721B9 /* RAUtils.m in Sources */,
+				3C7A15F52B58F7ED004112E9 /* CustomPresentationController.m in Sources */,
+				3C2DA50C2B2BF03E007721B9 /* SliderPage.m in Sources */,
+				3C2DA50B2B2BF03E007721B9 /* CycleScrollView.m in Sources */,
+				3C2DA4E72B2AAB50007721B9 /* RAPopviewContainer.m in Sources */,
+				3CF439EA2B6797BA00555C19 /* ItemSearchViewController.m in Sources */,
+				3C2DA4CE2B2AA905007721B9 /* HomeViewController.m in Sources */,
+				3C2DA4E62B2AAB50007721B9 /* MessageBox.m in Sources */,
+				3CC41D892B4FC2F5007EFF14 /* DetailSlideImageCell.m in Sources */,
+				3C2DA4D12B2AA91D007721B9 /* MyViewController.m in Sources */,
+				3C2DA4EA2B2AF9BC007721B9 /* CatalogViewController.m in Sources */,
+				3C2DA4DD2B2AAB39007721B9 /* RAConvertor.m in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+		3C2DA4A72B298794007721B9 /* Main.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				3C2DA4A82B298794007721B9 /* Base */,
+			);
+			name = Main.storyboard;
+			sourceTree = "<group>";
+		};
+		3C2DA4AC2B298796007721B9 /* LaunchScreen.storyboard */ = {
+			isa = PBXVariantGroup;
+			children = (
+				3C2DA4AD2B298796007721B9 /* Base */,
+			);
+			name = LaunchScreen.storyboard;
+			sourceTree = "<group>";
+		};
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+		3C2DA4B22B298796007721B9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = dwarf;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_TESTABILITY = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu17;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PREPROCESSOR_DEFINITIONS = (
+					"DEBUG=1",
+					"$(inherited)",
+				);
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 17.0;
+				LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+				MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+				MTL_FAST_MATH = YES;
+				ONLY_ACTIVE_ARCH = YES;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		3C2DA4B32B298796007721B9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+				CLANG_ANALYZER_NONNULL = YES;
+				CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+				CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+				CLANG_ENABLE_MODULES = YES;
+				CLANG_ENABLE_OBJC_ARC = YES;
+				CLANG_ENABLE_OBJC_WEAK = YES;
+				CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+				CLANG_WARN_BOOL_CONVERSION = YES;
+				CLANG_WARN_COMMA = YES;
+				CLANG_WARN_CONSTANT_CONVERSION = YES;
+				CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+				CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+				CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+				CLANG_WARN_EMPTY_BODY = YES;
+				CLANG_WARN_ENUM_CONVERSION = YES;
+				CLANG_WARN_INFINITE_RECURSION = YES;
+				CLANG_WARN_INT_CONVERSION = YES;
+				CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+				CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+				CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+				CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+				CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+				CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+				CLANG_WARN_STRICT_PROTOTYPES = YES;
+				CLANG_WARN_SUSPICIOUS_MOVE = YES;
+				CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+				CLANG_WARN_UNREACHABLE_CODE = YES;
+				CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+				COPY_PHASE_STRIP = NO;
+				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+				ENABLE_NS_ASSERTIONS = NO;
+				ENABLE_STRICT_OBJC_MSGSEND = YES;
+				ENABLE_USER_SCRIPT_SANDBOXING = YES;
+				GCC_C_LANGUAGE_STANDARD = gnu17;
+				GCC_NO_COMMON_BLOCKS = YES;
+				GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+				GCC_WARN_UNDECLARED_SELECTOR = YES;
+				GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+				GCC_WARN_UNUSED_FUNCTION = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				IPHONEOS_DEPLOYMENT_TARGET = 17.0;
+				LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+				MTL_ENABLE_DEBUG_INFO = NO;
+				MTL_FAST_MATH = YES;
+				SDKROOT = iphoneos;
+				VALIDATE_PRODUCT = YES;
+			};
+			name = Release;
+		};
+		3C2DA4B52B298796007721B9 /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_TEAM = HXWLAA5YN5;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_FILE = iShop/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = iShop;
+				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.shopping";
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+				INFOPLIST_KEY_UIMainStoryboardFile = Main;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.usai.iShop;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+				SUPPORTS_MACCATALYST = NO;
+				SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Debug;
+		};
+		3C2DA4B62B298796007721B9 /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+				ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+				CODE_SIGN_STYLE = Automatic;
+				CURRENT_PROJECT_VERSION = 1;
+				DEVELOPMENT_TEAM = HXWLAA5YN5;
+				GENERATE_INFOPLIST_FILE = YES;
+				INFOPLIST_FILE = iShop/Info.plist;
+				INFOPLIST_KEY_CFBundleDisplayName = iShop;
+				INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.shopping";
+				INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+				INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+				INFOPLIST_KEY_UIMainStoryboardFile = Main;
+				INFOPLIST_KEY_UISupportedInterfaceOrientations = UIInterfaceOrientationPortrait;
+				IPHONEOS_DEPLOYMENT_TARGET = 15.0;
+				LD_RUNPATH_SEARCH_PATHS = (
+					"$(inherited)",
+					"@executable_path/Frameworks",
+				);
+				MARKETING_VERSION = 1.0;
+				PRODUCT_BUNDLE_IDENTIFIER = com.usai.iShop;
+				PRODUCT_NAME = "$(TARGET_NAME)";
+				SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
+				SUPPORTS_MACCATALYST = NO;
+				SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO;
+				SWIFT_EMIT_LOC_STRINGS = YES;
+				TARGETED_DEVICE_FAMILY = 1;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		3C2DA4962B298794007721B9 /* Build configuration list for PBXProject "iShop" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3C2DA4B22B298796007721B9 /* Debug */,
+				3C2DA4B32B298796007721B9 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		3C2DA4B42B298796007721B9 /* Build configuration list for PBXNativeTarget "iShop" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				3C2DA4B52B298796007721B9 /* Debug */,
+				3C2DA4B62B298796007721B9 /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 3C2DA4932B298794007721B9 /* Project object */;
+}

+ 7 - 0
RedAnt iShop/iShop.xcodeproj/project.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "self:">
+   </FileRef>
+</Workspace>

+ 8 - 0
RedAnt iShop/iShop.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

BIN
RedAnt iShop/iShop.xcodeproj/project.xcworkspace/xcuserdata/ruizhang.xcuserdatad/UserInterfaceState.xcuserstate


+ 7 - 0
RedAnt iShop/iShop.xcworkspace/contents.xcworkspacedata

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+   version = "1.0">
+   <FileRef
+      location = "container:iShop.xcodeproj">
+   </FileRef>
+</Workspace>

+ 8 - 0
RedAnt iShop/iShop.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>IDEDidComputeMac32BitWarning</key>
+	<true/>
+</dict>
+</plist>

BIN
RedAnt iShop/iShop.xcworkspace/xcuserdata/ruizhang.xcuserdatad/UserInterfaceState.xcuserstate


+ 164 - 0
RedAnt iShop/iShop.xcworkspace/xcuserdata/ruizhang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -0,0 +1,164 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+   uuid = "9E7783FD-05BE-4F24-A00A-432382209D89"
+   type = "0"
+   version = "2.0">
+   <Breakpoints>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint">
+         <BreakpointContent
+            uuid = "A7A2F0BF-CB66-4940-AD24-3434D8DEC02B"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            breakpointStackSelectionBehavior = "1"
+            scope = "1"
+            stopOnStyle = "0">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "0C715FF7-7700-4D08-B820-21AC22FC9D06"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "iShop/detail/CatalogModelDetailViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "924"
+            endingLineNumber = "924"
+            landmarkName = "-tableView:cellForRowAtIndexPath:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "B005EB4B-B85E-4592-8C77-859F67798702"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "iShop/detail/CatalogModelDetailViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "935"
+            endingLineNumber = "935"
+            landmarkName = "-tableView:cellForRowAtIndexPath:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "26D1DA87-321B-42CB-B125-DAD57A0802CB"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "iShop/detail/CatalogModelDetailViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "953"
+            endingLineNumber = "953"
+            landmarkName = "-tableView:cellForRowAtIndexPath:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "05D0132C-E768-4C83-96A0-5F243F77B9F9"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "iShop/detail/CatalogModelDetailViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "559"
+            endingLineNumber = "559"
+            landmarkName = "-tableView:heightForRowAtIndexPath:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "D4DFCC0D-F6B0-40F6-8560-9D3AEB69B46C"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "iShop/detail/CatalogModelDetailViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "575"
+            endingLineNumber = "575"
+            landmarkName = "-tableView:heightForRowAtIndexPath:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "5719CC22-00DD-44CE-A120-27213349B8CE"
+            shouldBeEnabled = "No"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "iShop/detail/CatalogModelDetailViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "1004"
+            endingLineNumber = "1004"
+            landmarkName = "-tableView:cellForRowAtIndexPath:"
+            landmarkType = "7">
+            <Locations>
+               <Location
+                  uuid = "5719CC22-00DD-44CE-A120-27213349B8CE - 584fdb7b9e28e08"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "-[CatalogModelDetailViewController tableView:cellForRowAtIndexPath:]"
+                  moduleName = "iShop"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/ruizhang/Documents/CODE_IOS/ERPSuiteIOS/RedAnt%20iShop/iShop/detail/CatalogModelDetailViewController.m"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1000"
+                  endingLineNumber = "1000"
+                  offsetFromSymbolStart = "10838">
+               </Location>
+               <Location
+                  uuid = "5719CC22-00DD-44CE-A120-27213349B8CE - 584fdb7b9e28e08"
+                  shouldBeEnabled = "Yes"
+                  ignoreCount = "0"
+                  continueAfterRunningActions = "No"
+                  symbolName = "-[CatalogModelDetailViewController tableView:cellForRowAtIndexPath:]"
+                  moduleName = "iShop"
+                  usesParentBreakpointCondition = "Yes"
+                  urlString = "file:///Users/ruizhang/Documents/CODE_IOS/ERPSuiteIOS/RedAnt%20iShop/iShop/detail/CatalogModelDetailViewController.m"
+                  startingColumnNumber = "9223372036854775807"
+                  endingColumnNumber = "9223372036854775807"
+                  startingLineNumber = "1000"
+                  endingLineNumber = "1000"
+                  offsetFromSymbolStart = "10492">
+               </Location>
+            </Locations>
+         </BreakpointContent>
+      </BreakpointProxy>
+      <BreakpointProxy
+         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
+         <BreakpointContent
+            uuid = "7E297549-354A-46BF-AB22-AE293DF7366C"
+            shouldBeEnabled = "Yes"
+            ignoreCount = "0"
+            continueAfterRunningActions = "No"
+            filePath = "iShop/detail/CatalogModelDetailViewController.m"
+            startingColumnNumber = "9223372036854775807"
+            endingColumnNumber = "9223372036854775807"
+            startingLineNumber = "970"
+            endingLineNumber = "970"
+            landmarkName = "-tableView:cellForRowAtIndexPath:"
+            landmarkType = "7">
+         </BreakpointContent>
+      </BreakpointProxy>
+   </Breakpoints>
+</Bucket>

+ 14 - 0
RedAnt iShop/iShop/AppDelegate.h

@@ -0,0 +1,14 @@
+//
+//  AppDelegate.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/13/23.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+@property (strong,nonatomic)NSMutableDictionary* recent_model;
+@end
+

+ 43 - 0
RedAnt iShop/iShop/AppDelegate.m

@@ -0,0 +1,43 @@
+//
+//  AppDelegate.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/13/23.
+//
+
+#import "AppDelegate.h"
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+    // Override point for customization after application launch.
+    
+    
+    self.recent_model = [[NSMutableDictionary alloc]init];
+    return YES;
+}
+
+
+#pragma mark - UISceneSession lifecycle
+
+
+- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
+    // Called when a new scene session is being created.
+    // Use this method to select a configuration to create the new scene with.
+    return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
+}
+
+
+- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
+    // Called when the user discards a scene session.
+    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+}
+
+
+@end

+ 26 - 0
RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/Contents.json

@@ -0,0 +1,26 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "template-rendering-intent" : "template"
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/18_closeout.imageset/appicon.png


+ 26 - 0
RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/Contents.json

@@ -0,0 +1,26 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "template-rendering-intent" : "template"
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/20_trash.imageset/appicon.png


+ 26 - 0
RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/Contents.json

@@ -0,0 +1,26 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  },
+  "properties" : {
+    "template-rendering-intent" : "template"
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_closeout.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_filter.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_layout_grid.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/24_layout_list.imageset/appicon.png


+ 11 - 0
RedAnt iShop/iShop/Assets.xcassets/AccentColor.colorset/Contents.json

@@ -0,0 +1,11 @@
+{
+  "colors" : [
+    {
+      "idiom" : "universal"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 13 - 0
RedAnt iShop/iShop/Assets.xcassets/AppIcon.appiconset/Contents.json

@@ -0,0 +1,13 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "platform" : "ios",
+      "size" : "1024x1024"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 6 - 0
RedAnt iShop/iShop/Assets.xcassets/Contents.json

@@ -0,0 +1,6 @@
+{
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/check_24.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/down_arrow.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_cart.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_catalog.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_favorite.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_home.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_my.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/tab_search.imageset/appicon.png


+ 23 - 0
RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/Contents.json

@@ -0,0 +1,23 @@
+{
+  "images" : [
+    {
+      "filename" : "appicon.png",
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "appicon 1.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "appicon 2.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

BIN
RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/appicon 1.png


BIN
RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/appicon 2.png


BIN
RedAnt iShop/iShop/Assets.xcassets/uncheck_24.imageset/appicon.png


+ 25 - 0
RedAnt iShop/iShop/Base.lproj/LaunchScreen.storyboard

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+    <dependencies>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--View Controller-->
+        <scene sceneID="EHf-IW-A2E">
+            <objects>
+                <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+                        <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+                        <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+                    </view>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="53" y="375"/>
+        </scene>
+    </scenes>
+</document>

+ 432 - 0
RedAnt iShop/iShop/Base.lproj/Main.storyboard

@@ -0,0 +1,432 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="3JD-X6-A0c">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--Frame Root-->
+        <scene sceneID="AUb-GZ-dX7">
+            <objects>
+                <tabBarController storyboardIdentifier="FrameRoot" useStoryboardIdentifierAsRestorationIdentifier="YES" id="3JD-X6-A0c" customClass="FrameRoot" sceneMemberID="viewController">
+                    <tabBar key="tabBar" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" id="HKR-h7-Gcz">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="49"/>
+                        <autoresizingMask key="autoresizingMask"/>
+                        <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                    </tabBar>
+                </tabBarController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="F8y-CO-AXj" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-1538" y="32"/>
+        </scene>
+        <!--Catalog Model Detail View Controller-->
+        <scene sceneID="MXm-Nw-0BC">
+            <objects>
+                <viewController storyboardIdentifier="CatalogModelDetailViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="e3I-ca-Pdx" customClass="CatalogModelDetailViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="pE6-hv-Q4W">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="Hye-40-NOg">
+                                <rect key="frame" x="0.0" y="59" width="393" height="759"/>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <inset key="separatorInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                                <prototypes>
+                                    <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="DetailInfoCell" rowHeight="44" id="Lwr-KP-E0n" customClass="DetailKVCell">
+                                        <rect key="frame" x="0.0" y="50" width="393" height="44"/>
+                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Lwr-KP-E0n" id="Ytb-wb-8Th">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="44"/>
+                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                            <subviews>
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="DAJ-bC-Ruv">
+                                                    <rect key="frame" x="20" y="11" width="82" height="21"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="eUQ-fV-FYp" customClass="RTLabel">
+                                                    <rect key="frame" x="124" y="10" width="151" height="22"/>
+                                                    <autoresizingMask key="autoresizingMask" flexibleMinX="YES" widthSizable="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                </view>
+                                            </subviews>
+                                        </tableViewCellContentView>
+                                        <constraints>
+                                            <constraint firstAttribute="trailing" secondItem="Ytb-wb-8Th" secondAttribute="trailing" id="EH9-nk-gh3"/>
+                                            <constraint firstAttribute="bottom" secondItem="Ytb-wb-8Th" secondAttribute="bottom" id="Low-Fv-aYa"/>
+                                            <constraint firstItem="Ytb-wb-8Th" firstAttribute="top" secondItem="Lwr-KP-E0n" secondAttribute="top" id="Qlm-0d-CTG"/>
+                                            <constraint firstItem="Ytb-wb-8Th" firstAttribute="leading" secondItem="Lwr-KP-E0n" secondAttribute="leading" id="svn-5l-OY2"/>
+                                        </constraints>
+                                        <connections>
+                                            <outlet property="keyLabel" destination="DAJ-bC-Ruv" id="rtO-O5-Oai"/>
+                                            <outlet property="valLabel" destination="eUQ-fV-FYp" id="H2M-tM-Jtb"/>
+                                        </connections>
+                                    </tableViewCell>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="DetailImageCell" rowHeight="295" id="3tx-8M-0aN" customClass="DetailSlideImageCell">
+                                        <rect key="frame" x="0.0" y="94" width="393" height="295"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="3tx-8M-0aN" id="1CS-0P-x8q">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="295"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </tableViewCellContentView>
+                                    </tableViewCell>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="DetailBasicCell0" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="DetailBasicCell0" rowHeight="295" id="fUS-jn-2jh" customClass="DetailBasicCell0">
+                                        <rect key="frame" x="0.0" y="389" width="393" height="295"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="fUS-jn-2jh" id="H5u-g3-lWb">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="295"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ewR-lB-Jrr" userLabel="Description RTLabel" customClass="RTLabel">
+                                                    <rect key="frame" x="13" y="10" width="367" height="76"/>
+                                                </view>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="dVc-eM-Wbu">
+                                                    <rect key="frame" x="33" y="86" width="327" height="21"/>
+                                                    <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
+                                                    <color key="textColor" systemColor="systemGrayColor"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="KyT-PW-0ZD" userLabel="selector group">
+                                                    <rect key="frame" x="13" y="112" width="367" height="121"/>
+                                                    <subviews>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Select" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="x9j-xd-cKM">
+                                                            <rect key="frame" x="0.0" y="0.0" width="48" height="21"/>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                            <nil key="textColor"/>
+                                                            <nil key="highlightedColor"/>
+                                                        </label>
+                                                        <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Uqi-mf-gZ2">
+                                                            <rect key="frame" x="0.0" y="21" width="367" height="75"/>
+                                                            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="height" constant="75" id="dMo-YV-f0x"/>
+                                                            </constraints>
+                                                            <state key="normal">
+                                                                <color key="titleShadowColor" red="0.5" green="0.5" blue="0.5" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                            </state>
+                                                            <connections>
+                                                                <action selector="OnSelectorClick:" destination="fUS-jn-2jh" eventType="touchUpInside" id="CG4-Is-bvX"/>
+                                                            </connections>
+                                                        </button>
+                                                        <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="fmx-Bc-htM">
+                                                            <rect key="frame" x="1" y="22.666666666666657" width="72" height="72"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="height" constant="72" id="QIT-Hn-YBt"/>
+                                                                <constraint firstAttribute="width" constant="72" id="eMX-Fe-FMR"/>
+                                                            </constraints>
+                                                        </imageView>
+                                                        <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="down_arrow" translatesAutoresizingMaskIntoConstraints="NO" id="p55-RG-HcW">
+                                                            <rect key="frame" x="338" y="46.666666666666657" width="24" height="24"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="height" constant="24" id="4Ok-CV-CvE"/>
+                                                                <constraint firstAttribute="width" constant="24" id="74q-NL-ndM"/>
+                                                            </constraints>
+                                                        </imageView>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="" textAlignment="natural" lineBreakMode="wordWrap" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="PAO-Sw-kN0">
+                                                            <rect key="frame" x="73" y="28.666666666666657" width="265" height="60"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="height" constant="60" id="FjT-qr-MJd"/>
+                                                            </constraints>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                            <nil key="highlightedColor"/>
+                                                        </label>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="prop val" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ser-Tx-OZw">
+                                                            <rect key="frame" x="187.66666666666663" y="96" width="179.33333333333337" height="21"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="height" constant="21" id="zle-A9-P1D"/>
+                                                            </constraints>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                            <nil key="highlightedColor"/>
+                                                        </label>
+                                                        <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" restorationIdentifier="property" text="property" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="QU2-sM-18y">
+                                                            <rect key="frame" x="0.0" y="96" width="179.66666666666666" height="21"/>
+                                                            <constraints>
+                                                                <constraint firstAttribute="height" constant="21" id="kcR-pE-Wa0"/>
+                                                            </constraints>
+                                                            <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                            <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                            <nil key="highlightedColor"/>
+                                                        </label>
+                                                    </subviews>
+                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                                    <constraints>
+                                                        <constraint firstItem="x9j-xd-cKM" firstAttribute="leading" secondItem="KyT-PW-0ZD" secondAttribute="leading" id="2DR-rM-tip"/>
+                                                        <constraint firstItem="Uqi-mf-gZ2" firstAttribute="leading" secondItem="KyT-PW-0ZD" secondAttribute="leading" id="2bh-n4-Voq"/>
+                                                        <constraint firstItem="QU2-sM-18y" firstAttribute="top" secondItem="Uqi-mf-gZ2" secondAttribute="bottom" id="4oo-So-9yY"/>
+                                                        <constraint firstItem="QU2-sM-18y" firstAttribute="leading" secondItem="Uqi-mf-gZ2" secondAttribute="leading" id="5rf-Yd-0JV"/>
+                                                        <constraint firstItem="ser-Tx-OZw" firstAttribute="leading" secondItem="QU2-sM-18y" secondAttribute="trailing" constant="8" id="6Sn-28-j8T"/>
+                                                        <constraint firstItem="fmx-Bc-htM" firstAttribute="centerY" secondItem="Uqi-mf-gZ2" secondAttribute="centerY" id="9r4-Eb-VwG"/>
+                                                        <constraint firstItem="p55-RG-HcW" firstAttribute="centerY" secondItem="Uqi-mf-gZ2" secondAttribute="centerY" id="E4m-l8-MF4"/>
+                                                        <constraint firstItem="PAO-Sw-kN0" firstAttribute="centerY" secondItem="Uqi-mf-gZ2" secondAttribute="centerY" id="Fwl-m7-ivg"/>
+                                                        <constraint firstAttribute="height" constant="121" id="KXM-VD-1t2"/>
+                                                        <constraint firstItem="PAO-Sw-kN0" firstAttribute="leading" secondItem="fmx-Bc-htM" secondAttribute="trailing" id="SC5-Hs-cR9"/>
+                                                        <constraint firstItem="ser-Tx-OZw" firstAttribute="trailing" secondItem="Uqi-mf-gZ2" secondAttribute="trailing" id="TpG-3B-paT"/>
+                                                        <constraint firstItem="ser-Tx-OZw" firstAttribute="width" secondItem="QU2-sM-18y" secondAttribute="width" id="V0X-2V-eQS"/>
+                                                        <constraint firstItem="p55-RG-HcW" firstAttribute="leading" secondItem="PAO-Sw-kN0" secondAttribute="trailing" id="XuQ-hZ-sx0"/>
+                                                        <constraint firstItem="Uqi-mf-gZ2" firstAttribute="top" secondItem="KyT-PW-0ZD" secondAttribute="top" constant="21" id="bZy-vn-Xyi"/>
+                                                        <constraint firstItem="Uqi-mf-gZ2" firstAttribute="trailing" secondItem="p55-RG-HcW" secondAttribute="trailing" constant="5" id="bhf-lk-alN"/>
+                                                        <constraint firstAttribute="trailing" secondItem="Uqi-mf-gZ2" secondAttribute="trailing" id="nx5-4q-Blw"/>
+                                                        <constraint firstItem="x9j-xd-cKM" firstAttribute="top" secondItem="KyT-PW-0ZD" secondAttribute="top" id="qi2-ef-kTI"/>
+                                                        <constraint firstItem="fmx-Bc-htM" firstAttribute="leading" secondItem="Uqi-mf-gZ2" secondAttribute="leading" constant="1" id="rG5-5d-kew"/>
+                                                        <constraint firstItem="ser-Tx-OZw" firstAttribute="centerY" secondItem="QU2-sM-18y" secondAttribute="centerY" id="zl4-VM-QVH"/>
+                                                    </constraints>
+                                                </view>
+                                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="32x-C6-5Fw">
+                                                    <rect key="frame" x="13" y="243" width="367" height="44"/>
+                                                    <color key="tintColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                    <state key="normal" title="Button"/>
+                                                    <buttonConfiguration key="configuration" style="filled" image="tab_favorite" title="Add To List" imagePadding="8" cornerStyle="capsule"/>
+                                                    <connections>
+                                                        <action selector="OnAddListClick:" destination="fUS-jn-2jh" eventType="touchUpInside" id="o6s-q1-m6P"/>
+                                                    </connections>
+                                                </button>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstAttribute="trailingMargin" secondItem="dVc-eM-Wbu" secondAttribute="trailing" constant="13" id="2EA-jO-Hq5"/>
+                                                <constraint firstAttribute="trailing" secondItem="ewR-lB-Jrr" secondAttribute="trailing" constant="13" id="600-k6-aJJ"/>
+                                                <constraint firstAttribute="trailing" secondItem="KyT-PW-0ZD" secondAttribute="trailing" constant="13" id="6RR-4G-tZe"/>
+                                                <constraint firstAttribute="bottom" secondItem="32x-C6-5Fw" secondAttribute="bottom" constant="8" id="6z7-8h-k8B"/>
+                                                <constraint firstItem="ewR-lB-Jrr" firstAttribute="top" secondItem="H5u-g3-lWb" secondAttribute="top" constant="10" id="9UR-qH-9z3"/>
+                                                <constraint firstItem="32x-C6-5Fw" firstAttribute="leading" secondItem="H5u-g3-lWb" secondAttribute="leading" constant="13" id="FGe-D5-7He"/>
+                                                <constraint firstItem="ewR-lB-Jrr" firstAttribute="leading" secondItem="H5u-g3-lWb" secondAttribute="leading" constant="13" id="LLT-nT-SaV"/>
+                                                <constraint firstItem="dVc-eM-Wbu" firstAttribute="leading" secondItem="H5u-g3-lWb" secondAttribute="leadingMargin" constant="13" id="LLl-4p-sqV"/>
+                                                <constraint firstAttribute="trailing" secondItem="32x-C6-5Fw" secondAttribute="trailing" constant="13" id="MAy-q1-er4"/>
+                                                <constraint firstItem="32x-C6-5Fw" firstAttribute="top" secondItem="KyT-PW-0ZD" secondAttribute="bottom" constant="10" id="MBs-Nw-9BQ"/>
+                                                <constraint firstItem="KyT-PW-0ZD" firstAttribute="leading" secondItem="H5u-g3-lWb" secondAttribute="leading" constant="13" id="axB-7d-Fej"/>
+                                                <constraint firstItem="dVc-eM-Wbu" firstAttribute="top" secondItem="ewR-lB-Jrr" secondAttribute="bottom" id="owX-yH-rFp"/>
+                                                <constraint firstItem="KyT-PW-0ZD" firstAttribute="top" secondItem="dVc-eM-Wbu" secondAttribute="bottom" constant="5" id="pYJ-K1-kg2"/>
+                                            </constraints>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <outlet property="btnAddList" destination="32x-C6-5Fw" id="pXO-cX-I15"/>
+                                            <outlet property="btnSelector" destination="Uqi-mf-gZ2" id="KjM-8j-FQn"/>
+                                            <outlet property="descriptionRTLabel" destination="ewR-lB-Jrr" id="3Bn-8w-U78"/>
+                                            <outlet property="imageviewSelector" destination="fmx-Bc-htM" id="Y5q-ZS-eY4"/>
+                                            <outlet property="labelModel" destination="dVc-eM-Wbu" id="YdY-yd-9Df"/>
+                                            <outlet property="labelProperty" destination="QU2-sM-18y" id="efB-x7-bfx"/>
+                                            <outlet property="labelPropertyVal" destination="ser-Tx-OZw" id="xXh-mW-30f"/>
+                                            <outlet property="labelSelector" destination="PAO-Sw-kN0" id="d23-ul-gpx"/>
+                                        </connections>
+                                    </tableViewCell>
+                                    <tableViewCell contentMode="scaleToFill" restorationIdentifier="DetailTopicCell" selectionStyle="default" indentationWidth="10" reuseIdentifier="DetailTopicCell" rowHeight="251" id="jXs-hO-MTW" customClass="DetailTopicCell">
+                                        <rect key="frame" x="0.0" y="684" width="393" height="251"/>
+                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="jXs-hO-MTW" id="l2q-Kb-fmY">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="251"/>
+                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                            <subviews>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Refreshing...
Please wait." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="IHl-Gd-5Xw">
+                                                    <rect key="frame" x="96.666666666666686" y="40" width="200" height="90"/>
+                                                    <color key="backgroundColor" red="1" green="0.14913141730000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="90" id="mti-Wy-cHP"/>
+                                                        <constraint firstAttribute="width" constant="200" id="v3I-Y1-Ug9"/>
+                                                    </constraints>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <color key="textColor" red="0.0" green="0.50196081400000003" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" minimumZoomScale="0.0" maximumZoomScale="0.0" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="tsT-R1-WIE">
+                                                    <rect key="frame" x="0.0" y="0.0" width="393" height="251"/>
+                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                                    <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="EtN-qn-Ads">
+                                                        <size key="itemSize" width="175" height="234"/>
+                                                        <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                                                        <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                                                        <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                                                    </collectionViewFlowLayout>
+                                                    <cells>
+                                                        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="RelatedModelCell" id="Jmw-Rh-UzF" customClass="CatalogCellSmall">
+                                                            <rect key="frame" x="0.0" y="8.6666666666666661" width="175" height="234"/>
+                                                            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                                            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                                                                <rect key="frame" x="0.0" y="0.0" width="175" height="234"/>
+                                                                <autoresizingMask key="autoresizingMask"/>
+                                                                <subviews>
+                                                                    <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Krv-Ir-Gtf">
+                                                                        <rect key="frame" x="0.0" y="0.0" width="175" height="175"/>
+                                                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                                        <constraints>
+                                                                            <constraint firstAttribute="width" secondItem="Krv-Ir-Gtf" secondAttribute="height" multiplier="1:1" id="Lvr-sR-6nl"/>
+                                                                        </constraints>
+                                                                    </imageView>
+                                                                    <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pea-dt-Yvn" userLabel="Label -description">
+                                                                        <rect key="frame" x="8" y="195" width="159" height="21"/>
+                                                                        <constraints>
+                                                                            <constraint firstAttribute="height" constant="21" id="FGZ-6O-Bi0"/>
+                                                                        </constraints>
+                                                                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                                        <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                                        <nil key="highlightedColor"/>
+                                                                    </label>
+                                                                </subviews>
+                                                            </view>
+                                                            <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                                            <constraints>
+                                                                <constraint firstItem="pea-dt-Yvn" firstAttribute="leading" secondItem="Jmw-Rh-UzF" secondAttribute="leading" constant="8" id="AsH-L9-OgV"/>
+                                                                <constraint firstItem="Krv-Ir-Gtf" firstAttribute="top" secondItem="Jmw-Rh-UzF" secondAttribute="top" id="C9A-58-Xnz"/>
+                                                                <constraint firstAttribute="bottom" secondItem="pea-dt-Yvn" secondAttribute="bottom" constant="18" id="Iz1-g4-P6N"/>
+                                                                <constraint firstAttribute="trailing" secondItem="pea-dt-Yvn" secondAttribute="trailing" constant="8" id="fyV-g2-6b1"/>
+                                                                <constraint firstItem="Krv-Ir-Gtf" firstAttribute="leading" secondItem="Jmw-Rh-UzF" secondAttribute="leading" id="kOs-Qe-rb6"/>
+                                                                <constraint firstAttribute="trailing" secondItem="Krv-Ir-Gtf" secondAttribute="trailing" id="uKg-Tg-cth"/>
+                                                            </constraints>
+                                                            <connections>
+                                                                <outlet property="cellImageView" destination="Krv-Ir-Gtf" id="J5s-TV-1yF"/>
+                                                                <outlet property="nameLabel" destination="pea-dt-Yvn" id="IEG-LE-Ffh"/>
+                                                            </connections>
+                                                        </collectionViewCell>
+                                                    </cells>
+                                                    <connections>
+                                                        <outlet property="dataSource" destination="jXs-hO-MTW" id="60U-LW-ki3"/>
+                                                        <outlet property="delegate" destination="jXs-hO-MTW" id="FIf-jR-jwj"/>
+                                                    </connections>
+                                                </collectionView>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstAttribute="trailing" secondItem="tsT-R1-WIE" secondAttribute="trailing" id="7sx-fH-s9g"/>
+                                                <constraint firstItem="tsT-R1-WIE" firstAttribute="leading" secondItem="l2q-Kb-fmY" secondAttribute="leading" id="LxG-xb-kmB"/>
+                                                <constraint firstAttribute="bottom" secondItem="tsT-R1-WIE" secondAttribute="bottom" id="O4s-A5-qUP"/>
+                                                <constraint firstItem="tsT-R1-WIE" firstAttribute="top" secondItem="l2q-Kb-fmY" secondAttribute="top" id="bhg-y5-Xxv"/>
+                                                <constraint firstItem="IHl-Gd-5Xw" firstAttribute="top" secondItem="l2q-Kb-fmY" secondAttribute="top" constant="40" id="drz-D5-A8f"/>
+                                                <constraint firstItem="IHl-Gd-5Xw" firstAttribute="centerX" secondItem="l2q-Kb-fmY" secondAttribute="centerX" id="t6P-Js-3Um"/>
+                                            </constraints>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <outlet property="refreshLabel" destination="IHl-Gd-5Xw" id="hRF-UZ-iGX"/>
+                                            <outlet property="topicCollectionView" destination="tsT-R1-WIE" id="1GN-hh-FRP"/>
+                                        </connections>
+                                    </tableViewCell>
+                                </prototypes>
+                                <connections>
+                                    <outlet property="dataSource" destination="e3I-ca-Pdx" id="vq7-P3-7zw"/>
+                                    <outlet property="delegate" destination="e3I-ca-Pdx" id="Ckg-HM-lFz"/>
+                                </connections>
+                            </tableView>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="jBZ-n5-AWH"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="Hye-40-NOg" firstAttribute="top" secondItem="jBZ-n5-AWH" secondAttribute="top" id="2bi-At-dXJ"/>
+                            <constraint firstItem="jBZ-n5-AWH" firstAttribute="trailing" secondItem="Hye-40-NOg" secondAttribute="trailing" id="nNS-gb-9QJ"/>
+                            <constraint firstItem="Hye-40-NOg" firstAttribute="leading" secondItem="jBZ-n5-AWH" secondAttribute="leading" id="oqc-7y-rAG"/>
+                            <constraint firstItem="jBZ-n5-AWH" firstAttribute="bottom" secondItem="Hye-40-NOg" secondAttribute="bottom" id="sMN-FW-iEJ"/>
+                        </constraints>
+                    </view>
+                    <connections>
+                        <outlet property="tableView" destination="Hye-40-NOg" id="sIk-VY-COR"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="BQl-2V-mrN" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-221" y="32"/>
+        </scene>
+        <!--Color Select View Controller-->
+        <scene sceneID="elF-4r-eBB">
+            <objects>
+                <viewController storyboardIdentifier="ColorSelectViewController" useStoryboardIdentifierAsRestorationIdentifier="YES" id="nwX-6b-cxG" customClass="ColorSelectViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="dSv-Ii-KeC">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="0To-pj-O3E">
+                                <rect key="frame" x="10" y="110" width="373" height="708"/>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <prototypes>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="ColorSelectCell" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="ColorSelectCell" rowHeight="72" id="8vs-Ja-ye6" customClass="ColorSelectCell">
+                                        <rect key="frame" x="0.0" y="50" width="373" height="72"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="8vs-Ja-ye6" id="p1a-yy-63s">
+                                            <rect key="frame" x="0.0" y="0.0" width="373" height="72"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="QsI-gU-nDo">
+                                                    <rect key="frame" x="13" y="0.0" width="72" height="72"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="width" constant="72" id="cfz-40-NB2"/>
+                                                        <constraint firstAttribute="height" constant="72" id="gdj-2o-zAz"/>
+                                                    </constraints>
+                                                </imageView>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="4Ew-yu-eBh">
+                                                    <rect key="frame" x="95" y="0.0" width="265" height="72"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <nil key="textColor"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstAttribute="trailing" secondItem="4Ew-yu-eBh" secondAttribute="trailing" constant="13" id="DPy-mF-M16"/>
+                                                <constraint firstItem="4Ew-yu-eBh" firstAttribute="top" secondItem="p1a-yy-63s" secondAttribute="top" id="GrQ-k3-OGO"/>
+                                                <constraint firstAttribute="bottom" secondItem="4Ew-yu-eBh" secondAttribute="bottom" id="Imq-IV-tuj"/>
+                                                <constraint firstItem="QsI-gU-nDo" firstAttribute="top" secondItem="p1a-yy-63s" secondAttribute="top" id="X5v-aP-4CK"/>
+                                                <constraint firstItem="QsI-gU-nDo" firstAttribute="leading" secondItem="p1a-yy-63s" secondAttribute="leading" constant="13" id="qB9-9S-VrA"/>
+                                                <constraint firstItem="4Ew-yu-eBh" firstAttribute="leading" secondItem="QsI-gU-nDo" secondAttribute="trailing" constant="10" id="sV1-JZ-08r"/>
+                                                <constraint firstAttribute="bottom" secondItem="QsI-gU-nDo" secondAttribute="bottom" id="ty2-E6-hih"/>
+                                            </constraints>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <outlet property="imageView" destination="QsI-gU-nDo" id="hzw-KF-99B"/>
+                                            <outlet property="label" destination="4Ew-yu-eBh" id="kV5-NQ-WXX"/>
+                                        </connections>
+                                    </tableViewCell>
+                                </prototypes>
+                                <connections>
+                                    <outlet property="dataSource" destination="nwX-6b-cxG" id="3Kd-78-t5S"/>
+                                    <outlet property="delegate" destination="nwX-6b-cxG" id="AwE-yf-cjT"/>
+                                </connections>
+                            </tableView>
+                            <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="nRl-lv-gbr">
+                                <rect key="frame" x="302" y="59" width="75" height="34.333333333333343"/>
+                                <state key="normal" title="Button"/>
+                                <buttonConfiguration key="configuration" style="plain" title="Button"/>
+                                <connections>
+                                    <action selector="onClose:" destination="nwX-6b-cxG" eventType="touchUpInside" id="psB-12-ZN4"/>
+                                </connections>
+                            </button>
+                            <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Select Color" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="0IO-hT-PG6">
+                                <rect key="frame" x="144" y="69" width="105" height="21"/>
+                                <fontDescription key="fontDescription" type="boldSystem" pointSize="18"/>
+                                <nil key="textColor"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="68Z-as-bFd"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="nRl-lv-gbr" firstAttribute="top" secondItem="68Z-as-bFd" secondAttribute="top" id="GPT-Jc-aMO"/>
+                            <constraint firstItem="0IO-hT-PG6" firstAttribute="centerX" secondItem="dSv-Ii-KeC" secondAttribute="centerX" id="KeF-Le-8xA"/>
+                            <constraint firstItem="0IO-hT-PG6" firstAttribute="top" secondItem="68Z-as-bFd" secondAttribute="top" constant="10" id="RqW-B6-g0P"/>
+                            <constraint firstItem="0To-pj-O3E" firstAttribute="leading" secondItem="68Z-as-bFd" secondAttribute="leading" constant="10" id="XjQ-0D-aNi"/>
+                            <constraint firstItem="68Z-as-bFd" firstAttribute="bottom" secondItem="0To-pj-O3E" secondAttribute="bottom" id="aZ7-Zc-fU5"/>
+                            <constraint firstItem="0To-pj-O3E" firstAttribute="top" secondItem="0IO-hT-PG6" secondAttribute="bottom" constant="20" id="f46-1j-LGQ"/>
+                            <constraint firstItem="68Z-as-bFd" firstAttribute="trailing" secondItem="0To-pj-O3E" secondAttribute="trailing" constant="10" id="h9z-aZ-Hxc"/>
+                            <constraint firstItem="68Z-as-bFd" firstAttribute="trailing" secondItem="nRl-lv-gbr" secondAttribute="trailing" constant="16" id="mRo-zk-6zc"/>
+                        </constraints>
+                    </view>
+                    <connections>
+                        <outlet property="tableView" destination="0To-pj-O3E" id="ubH-av-X6b"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="dXk-Ms-UST" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="974.80916030534343" y="31.690140845070424"/>
+        </scene>
+    </scenes>
+    <resources>
+        <image name="down_arrow" width="24" height="24"/>
+        <image name="tab_favorite" width="30" height="30"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+        <systemColor name="systemGrayColor">
+            <color red="0.55686274509803924" green="0.55686274509803924" blue="0.57647058823529407" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </systemColor>
+    </resources>
+</document>

+ 32 - 0
RedAnt iShop/iShop/HomeTableViewCellTopic.h

@@ -0,0 +1,32 @@
+//
+//  HomeTableViewCellTopic.h
+//  RedAnt ERP Mobile
+//
+//  Created by Ray on 7/21/15.
+//  Copyright (c) 2015 United Software Applications, Inc. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+@class HomeTableViewCellTopic;
+@protocol HomeTableViewCellTopicDelegate <NSObject>
+@required
+- (void) TopicItemClicked:(NSString*) product_id category:(NSString*) category;
+//- (void) LongPress:(UIView*)view row:(int) x column:(int) y;
+//- (void) LongPress:(UIView*)view row:(int) x;
+//- (void) Tap:(UIView*)view row:(int) x column:(int) y;
+//- (void) Tap:(UIView*)view row:(int) x;
+@end
+@interface HomeTableViewCellTopic : UITableViewCell<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout>
+{
+@private
+    //    id <MDSpreadViewDataSource>__unsafe_unretained _dataSource;
+    id <HomeTableViewCellTopicDelegate>  __weak itemdelegate;
+}
+@property (strong, nonatomic) IBOutlet UICollectionView *topicCollectionView;
+
+@property (weak, nonatomic) id <HomeTableViewCellTopicDelegate> itemdelegate;
+@property (strong, nonatomic) NSDictionary* related_data;
+@property (strong, nonatomic) IBOutlet UILabel *label_title;
+@end
+
+

+ 129 - 0
RedAnt iShop/iShop/HomeTableViewCellTopic.m

@@ -0,0 +1,129 @@
+//
+//  HomeTableViewCellTopic.m
+//  RedAnt ERP Mobile
+//
+//  Created by Ray on 7/21/15.
+//  Copyright (c) 2015 United Software Applications, Inc. All rights reserved.
+//
+
+#import "HomeTableViewCellTopic.h"
+#import "CatalogCellSmall.h"
+
+#import "CatalogModelDetailViewController.h"
+#import "FileCache.h"
+@implementation HomeTableViewCellTopic
+@synthesize itemdelegate;
+- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
+{
+    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
+    if (self) {
+        // Initialization code
+    }
+    return self;
+}
+//- (void)awakeFromNib {
+//    // Initialization code
+//}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+#pragma mark -- UICollectionViewDataSource
+
+-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
+
+{
+    
+    // 每个Section的item个数
+    int count =[[self.related_data  valueForKey:@"count"] intValue];
+    return count;
+    
+}
+-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
+{
+    return 1;
+}
+-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    
+    static NSString * CellIdentifier = @"RelatedModelCell";
+    CatalogCellSmall * cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
+    NSDictionary * item_json =[self.related_data objectForKey:[NSString stringWithFormat:@"item_%ld",(long)indexPath.row]];
+    NSString* img_url =[item_json valueForKey:@"picture_path"];
+    NSString* description =[item_json valueForKey:@"fash_name"];
+    //        NSString* old_price =[item_json valueForKey:@"old_price"];
+    //        NSString* price =[item_json valueForKey:@"price"];
+//    cell.description.text = description;
+    //        cell.oldPrice.text = old_price;
+    //        cell.Price.text = price;
+    cell.cellImageView.image = [UIImage imageNamed:@"loading_s"];
+    NSString* file_name=[img_url lastPathComponent];
+    NSData* img_data=[FileCache load_cached_img:file_name loadFrom:img_url];
+    if(img_data!=nil)
+    {
+        
+        UIImage * img =[UIImage imageWithData:img_data];
+        cell.cellImageView.image = img;
+    }
+    else
+    {
+        
+        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+            
+            NSData*  downloadimg_data = [NSData dataWithContentsOfURL:[NSURL URLWithString:img_url]];
+            
+            dispatch_async(dispatch_get_main_queue(), ^{
+                
+                
+                
+                if(downloadimg_data!=nil)
+                {
+                    
+                    [FileCache cache_img:downloadimg_data filename:file_name saveTo:img_url];
+                    
+                    UIImage * img =[UIImage imageWithData:downloadimg_data];
+                    cell.cellImageView.image = img;
+                }
+                else
+                    cell.cellImageView.image = [UIImage imageNamed:@"notfound_s"];
+                
+            });
+        });
+        
+        
+    }
+    return cell;
+    
+}
+
+#pragma mark --UICollectionViewDelegateFlowLayout
+
+
+
+////定义每个UICollectionView 的大小
+//- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
+//{
+//    return CGSizeMake(96, 100);
+//}
+//定义每个UICollectionView 的 margin
+-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
+{
+    
+    return UIEdgeInsetsMake(10, 10, 10, 10);
+}
+#pragma mark --UICollectionViewDelegate
+
+
+
+//UICollectionView被选中时调用的方法
+-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    NSDictionary* json=[self.related_data objectForKey:[NSString stringWithFormat:@"item_%ld",(long)indexPath.row]];
+    NSString* product_id = [json valueForKey:@"product_id"];
+    NSString* category = [json valueForKey:@"category"];
+    [itemdelegate TopicItemClicked : product_id category:category];
+}
+
+@end

+ 25 - 0
RedAnt iShop/iShop/Info.plist

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>UIApplicationSceneManifest</key>
+	<dict>
+		<key>UIApplicationSupportsMultipleScenes</key>
+		<false/>
+		<key>UISceneConfigurations</key>
+		<dict>
+			<key>UIWindowSceneSessionRoleApplication</key>
+			<array>
+				<dict>
+					<key>UISceneConfigurationName</key>
+					<string>Default Configuration</string>
+					<key>UISceneDelegateClassName</key>
+					<string>SceneDelegate</string>
+					<key>UISceneStoryboardFile</key>
+					<string>Main</string>
+				</dict>
+			</array>
+		</dict>
+	</dict>
+</dict>
+</plist>

+ 30 - 0
RedAnt iShop/iShop/RASingleton.h

@@ -0,0 +1,30 @@
+//
+//  RASingleton.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/18/23.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface RASingleton : NSObject
+
+
+
+@property (nonatomic,  strong) NSString *user;///替代appdelegate里的user访问
+@property (strong,nonatomic) NSString * password;
+@property (strong , nonatomic) NSString* ipad_perm;
+@property (strong,nonatomic) NSString* build;
+@property (strong,nonatomic) NSString * duid; //推送令牌
+@property (strong , nonatomic) NSString* contact_id;
+
+@property (strong,nonatomic)NSDictionary* categoryMenu; //catalog menu;
+#pragma mark - Method
+
++ (instancetype)sharedInstance;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 30 - 0
RedAnt iShop/iShop/RASingleton.m

@@ -0,0 +1,30 @@
+//
+//  RASingleton.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/18/23.
+//
+
+#import "RASingleton.h"
+
+@implementation RASingleton
+
+
+#pragma mark - Method
+
++ (instancetype)sharedInstance {
+    
+    static RASingleton *singleton = nil;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        
+        singleton = [[RASingleton alloc] init];
+//        [[NSNotificationCenter defaultCenter] addObserver:singleton selector:@selector(handleLogin:) name:User_LoginOK_Notification object:nil];
+        
+
+        
+
+    });
+    return singleton;
+}
+@end

+ 16 - 0
RedAnt iShop/iShop/RootFrame/CartViewController.h

@@ -0,0 +1,16 @@
+//
+//  CartViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "TabViewController.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CartViewController : TabViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 31 - 0
RedAnt iShop/iShop/RootFrame/CartViewController.m

@@ -0,0 +1,31 @@
+//
+//  CartViewController.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import "CartViewController.h"
+
+@interface CartViewController ()
+
+@end
+
+@implementation CartViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 19 - 0
RedAnt iShop/iShop/RootFrame/CatalogViewController.h

@@ -0,0 +1,19 @@
+//
+//  CatalogViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "TabViewController.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CatalogViewController : TabViewController
+@property (strong,nonatomic)NSDictionary* categoryMenu;
+@property (weak, nonatomic) IBOutlet UITableView *tableView;
+@property (strong,nonatomic)NSString* strtitle;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 164 - 0
RedAnt iShop/iShop/RootFrame/CatalogViewController.m

@@ -0,0 +1,164 @@
+//
+//  CatalogViewController.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import "CatalogViewController.h"
+#import "RANetwork.h"
+#import "CatalogListViewController.h"
+
+@interface CatalogViewController ()
+
+@end
+
+@implementation CatalogViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    self.strtitle=@"";
+    self.show_navi = true;
+    
+    
+    if(self.categoryMenu==nil)
+    {
+        
+        
+        if(RASingleton.sharedInstance.categoryMenu)
+        {
+            self.categoryMenu = RASingleton.sharedInstance.categoryMenu;
+            [self.tableView reloadData];
+            
+            self.strtitle= @"Shop by Department";
+            
+        }
+        else
+        {
+            [RANetwork request_category:^(NSMutableDictionary *result) {
+                NSDictionary* category=result;
+                if([[category valueForKey:@"result"] intValue]==2)
+                {
+                    self.categoryMenu = category;
+                    [self.tableView reloadData];
+                    
+                    self.strtitle= @"Shop by Department";
+                }
+            }];
+        }
+
+        return;
+    
+    }
+    else
+    {
+        self.strtitle = self.categoryMenu[@"title"];
+        self.title = self.categoryMenu[@"title"];
+    }
+    
+    
+    
+}
+
+- (void)viewWillAppear:(BOOL)animated
+{
+    [super viewWillAppear:animated];
+    
+    
+    
+}
+
+
+
+#pragma mark tableview
+
+//- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
+//{
+//    return 20;
+//}
+//- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
+//{
+//    
+//    
+//    
+////    return @"abc";
+//    
+//    if(self.strtitle.length>0)
+//    {
+//        return self.strtitle;
+//    }
+//    else
+//        return @" ";
+//}
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+    
+    return [self.categoryMenu[@"count"] intValue];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+    
+    static NSString *CellIdentifier = @"Cell";
+  //      UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
+    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+    if (!cell) {
+        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
+    }
+
+    NSString* key = [NSString stringWithFormat:@"category_%ld", indexPath.row];
+    
+    cell.textLabel.text =self.categoryMenu[key][@"title"];
+    
+    int child_count =[self.categoryMenu[key][@"count"] intValue];
+    if(child_count>0)
+        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
+    return cell;
+}
+-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(nonnull NSIndexPath *)indexPath
+{
+    NSString* key = [NSString stringWithFormat:@"category_%ld", indexPath.row];
+    
+    int child_count =[self.categoryMenu[key][@"count"] intValue];
+    if(child_count>0)
+    {
+        CatalogViewController* vc = [[UIStoryboard storyboardWithName:@"Frame" bundle:nil] instantiateViewControllerWithIdentifier:@"CatalogViewController"];
+    
+        vc.show_navi = true;
+        vc.categoryMenu =self.categoryMenu[key];
+        [self.navigationController pushViewController:vc animated:TRUE];
+        
+        
+        
+    }
+    else{
+        
+        CatalogListViewController* vc= [[UIStoryboard storyboardWithName:@"catalog" bundle:nil] instantiateViewControllerWithIdentifier:@"CatalogListViewController"];
+        vc.categoryid = self.categoryMenu[key][@"id"];
+        [self.navigationController pushViewController:vc animated:TRUE];
+    }
+//    AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
+//    CBPeripheral *p=appDelegate.nDevices[indexPath.item];
+//
+//
+//    // 如果点到当前连接设备,则忽略。
+//    if([appDelegate.peripheral.identifier.UUIDString isEqualToString:p.identifier.UUIDString])
+//        return;
+//    [self onDisconnect:nil];
+////    self.needVerifyUUID=p.identifier.UUIDString;
+//    appDelegate.peripheral = p;
+//        [appDelegate.manager connectPeripheral:appDelegate.peripheral options:nil];
+}
+
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 680 - 0
RedAnt iShop/iShop/RootFrame/Frame.storyboard

@@ -0,0 +1,680 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="22505" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="22504"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <scenes>
+        <!--HOME-->
+        <scene sceneID="s0d-6b-0kx">
+            <objects>
+                <viewController storyboardIdentifier="HomeViewController" title="HOME" useStoryboardIdentifierAsRestorationIdentifier="YES" id="Y6W-OH-hqX" customClass="HomeViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="5EZ-qb-Rvc">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="none" rowHeight="44" sectionHeaderHeight="22" sectionFooterHeight="22" translatesAutoresizingMaskIntoConstraints="NO" id="kXn-Rz-VfY" userLabel="home content table">
+                                <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <prototypes>
+                                    <tableViewCell contentMode="scaleToFill" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="HomeTableViewCellSlide" rowHeight="317" id="hdp-Uw-nGu" customClass="HomeTableViewCellSlide">
+                                        <rect key="frame" x="0.0" y="50" width="393" height="317"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="hdp-Uw-nGu" id="97n-pR-jk0">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="317"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </tableViewCellContentView>
+                                    </tableViewCell>
+                                    <tableViewCell contentMode="scaleToFill" restorationIdentifier="HomeTableViewCellBanner" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="HomeTableViewCellBanner" rowHeight="317" id="Q05-4H-94V" customClass="HomeTableViewCellBanner">
+                                        <rect key="frame" x="0.0" y="367" width="393" height="317"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Q05-4H-94V" id="o5j-G6-S6L">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="317"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ulx-0D-9z0">
+                                                    <rect key="frame" x="9" y="-13" width="395" height="308"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                </imageView>
+                                            </subviews>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <outlet property="BannerImageView" destination="ulx-0D-9z0" id="Tqf-om-hJs"/>
+                                        </connections>
+                                    </tableViewCell>
+                                    <tableViewCell contentMode="scaleToFill" restorationIdentifier="HomeTableViewCellButtonBanner" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="HomeTableViewCellButtonBanner" rowHeight="317" id="MHS-8n-Xp0" customClass="HomeTableViewCellButtonBanner">
+                                        <rect key="frame" x="0.0" y="684" width="393" height="317"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="MHS-8n-Xp0" id="LIa-ua-yAE">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="317"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                        </tableViewCellContentView>
+                                    </tableViewCell>
+                                    <tableViewCell contentMode="scaleToFill" restorationIdentifier="HomeTableViewCellTopic" selectionStyle="default" indentationWidth="10" reuseIdentifier="HomeTableViewCellTopic" rowHeight="310" id="VeQ-s3-y3Q" customClass="HomeTableViewCellTopic">
+                                        <rect key="frame" x="0.0" y="1001" width="393" height="310"/>
+                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="VeQ-s3-y3Q" id="RFg-ZL-RkN">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="310"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="xJs-FF-9dc">
+                                                    <rect key="frame" x="-5" y="11" width="393" height="15"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
+                                                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                </view>
+                                                <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" fixedFrame="YES" minimumZoomScale="0.0" maximumZoomScale="0.0" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="HcK-Vl-0AW">
+                                                    <rect key="frame" x="-5" y="16" width="393" height="268"/>
+                                                    <autoresizingMask key="autoresizingMask" widthSizable="YES"/>
+                                                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <collectionViewFlowLayout key="collectionViewLayout" scrollDirection="horizontal" minimumLineSpacing="10" minimumInteritemSpacing="10" id="7F2-UG-Rdw">
+                                                        <size key="itemSize" width="175" height="234"/>
+                                                        <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                                                        <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                                                        <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                                                    </collectionViewFlowLayout>
+                                                    <cells>
+                                                        <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="RelatedModelCell" id="PKA-Ai-zsu" customClass="CatalogCellSmall">
+                                                            <rect key="frame" x="0.0" y="17" width="175" height="234"/>
+                                                            <autoresizingMask key="autoresizingMask"/>
+                                                            <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                                                                <rect key="frame" x="0.0" y="0.0" width="175" height="234"/>
+                                                                <autoresizingMask key="autoresizingMask"/>
+                                                                <subviews>
+                                                                    <imageView userInteractionEnabled="NO" contentMode="scaleToFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="pPv-1c-0u4">
+                                                                        <rect key="frame" x="1" y="1" width="173" height="172"/>
+                                                                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                                                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                                    </imageView>
+                                                                    <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Label" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="qCv-j1-feg" userLabel="Label -description">
+                                                                        <rect key="frame" x="8" y="195" width="159" height="21"/>
+                                                                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                                                                        <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                                        <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                                        <nil key="highlightedColor"/>
+                                                                    </label>
+                                                                </subviews>
+                                                            </view>
+                                                            <color key="backgroundColor" red="0.59999999999999998" green="0.40000000000000002" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                            <connections>
+                                                                <outlet property="cellDescription" destination="qCv-j1-feg" id="2NP-qY-CXm"/>
+                                                                <outlet property="cellImageView" destination="pPv-1c-0u4" id="4kk-JK-DBu"/>
+                                                            </connections>
+                                                        </collectionViewCell>
+                                                    </cells>
+                                                    <connections>
+                                                        <outlet property="dataSource" destination="VeQ-s3-y3Q" id="XVW-Na-8W3"/>
+                                                        <outlet property="delegate" destination="VeQ-s3-y3Q" id="xhL-2T-l5T"/>
+                                                    </connections>
+                                                </collectionView>
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Title" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="57K-xp-J7K">
+                                                    <rect key="frame" x="0.0" y="11" width="768" height="21"/>
+                                                    <autoresizingMask key="autoresizingMask"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="17"/>
+                                                    <color key="textColor" red="0.0" green="0.0" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                            </subviews>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <outlet property="label_title" destination="57K-xp-J7K" id="6AY-m9-IZf"/>
+                                            <outlet property="topicCollectionView" destination="HcK-Vl-0AW" id="FsH-A7-r7z"/>
+                                        </connections>
+                                    </tableViewCell>
+                                </prototypes>
+                                <connections>
+                                    <outlet property="dataSource" destination="Y6W-OH-hqX" id="wpv-Ju-j6v"/>
+                                    <outlet property="delegate" destination="Y6W-OH-hqX" id="Wke-Fm-9he"/>
+                                </connections>
+                            </tableView>
+                            <label hidden="YES" opaque="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" text="Cannot get data from server.
Tap to try again." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="KXB-pk-iCh">
+                                <rect key="frame" x="58" y="389" width="277" height="73"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="19"/>
+                                <color key="textColor" red="0.33333333329999998" green="0.33333333329999998" blue="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                            <activityIndicatorView opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" fixedFrame="YES" hidesWhenStopped="YES" animating="YES" style="gray" translatesAutoresizingMaskIntoConstraints="NO" id="lXN-GU-e5g">
+                                <rect key="frame" x="186" y="416" width="20" height="20"/>
+                                <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMinY="YES" flexibleMaxY="YES"/>
+                                <color key="color" red="0.59999999999999998" green="0.40000000000000002" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            </activityIndicatorView>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="vDu-zF-Fre"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="kXn-Rz-VfY" firstAttribute="leading" secondItem="5EZ-qb-Rvc" secondAttribute="leading" id="cLi-Ob-qZN"/>
+                            <constraint firstItem="kXn-Rz-VfY" firstAttribute="top" secondItem="5EZ-qb-Rvc" secondAttribute="top" id="g06-l6-6BB"/>
+                            <constraint firstAttribute="bottom" secondItem="kXn-Rz-VfY" secondAttribute="bottom" id="g2y-WJ-jsh"/>
+                            <constraint firstAttribute="trailing" secondItem="kXn-Rz-VfY" secondAttribute="trailing" id="gS5-1q-7ze"/>
+                        </constraints>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="home" image="tab_home" id="7hI-9a-TkS"/>
+                    <simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
+                    <connections>
+                        <outlet property="label_net_err" destination="KXB-pk-iCh" id="BXP-BS-lrf"/>
+                        <outlet property="mum" destination="lXN-GU-e5g" id="L9J-TE-dQ9"/>
+                        <outlet property="tableView" destination="kXn-Rz-VfY" id="v1Z-TI-1gl"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="Ief-a0-LHa" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="132" y="-13"/>
+        </scene>
+        <!--MY-->
+        <scene sceneID="B0Q-ZQ-Mnz">
+            <objects>
+                <viewController storyboardIdentifier="MyViewController" title="MY" useStoryboardIdentifierAsRestorationIdentifier="YES" id="sQc-ex-NeV" customClass="MyViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="OO4-Ei-nPT">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="L4G-Gg-hSx"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="my" image="tab_my" id="iVu-TC-gw5"/>
+                    <simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="bc4-jX-cfi" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="1087" y="-108"/>
+        </scene>
+        <!--CART-->
+        <scene sceneID="KiB-Sq-22z">
+            <objects>
+                <viewController storyboardIdentifier="CartViewController" title="CART" useStoryboardIdentifierAsRestorationIdentifier="YES" id="Gg6-nx-llU" customClass="CartViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="p0z-ns-4bi">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <viewLayoutGuide key="safeArea" id="kAK-Ay-Mig"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="cart" image="tab_cart" id="tDz-Ka-pst"/>
+                    <simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="RhK-mQ-WLX" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="2234" y="-136"/>
+        </scene>
+        <!--CATALOG-->
+        <scene sceneID="QWh-9Y-NjI">
+            <objects>
+                <viewController storyboardIdentifier="CatalogViewController" title="CATALOG" useStoryboardIdentifierAsRestorationIdentifier="YES" id="tWY-wZ-5rb" customClass="CatalogViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="P21-qN-WED">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="9jX-0h-egY">
+                                <rect key="frame" x="0.0" y="59" width="393" height="710"/>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <prototypes>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="Cell" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="Cell" textLabel="iiI-HY-udg" style="IBUITableViewCellStyleDefault" id="Kym-41-wGf">
+                                        <rect key="frame" x="0.0" y="50" width="393" height="43.666667938232422"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="Kym-41-wGf" id="JEl-pK-DdK">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="43.666667938232422"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="iiI-HY-udg">
+                                                    <rect key="frame" x="20" y="0.0" width="353" height="43.666667938232422"/>
+                                                    <autoresizingMask key="autoresizingMask"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                                                    <nil key="textColor"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                            </subviews>
+                                        </tableViewCellContentView>
+                                    </tableViewCell>
+                                </prototypes>
+                                <connections>
+                                    <outlet property="dataSource" destination="tWY-wZ-5rb" id="Zdi-GF-erS"/>
+                                    <outlet property="delegate" destination="tWY-wZ-5rb" id="w9n-vM-Uwd"/>
+                                </connections>
+                            </tableView>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="umo-BZ-XnI"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="umo-BZ-XnI" firstAttribute="trailing" secondItem="9jX-0h-egY" secondAttribute="trailing" id="ePk-Ad-eGb"/>
+                            <constraint firstItem="9jX-0h-egY" firstAttribute="top" secondItem="umo-BZ-XnI" secondAttribute="top" id="f4f-O7-YMA"/>
+                            <constraint firstItem="umo-BZ-XnI" firstAttribute="bottom" secondItem="9jX-0h-egY" secondAttribute="bottom" id="oeA-dU-QUc"/>
+                            <constraint firstItem="9jX-0h-egY" firstAttribute="leading" secondItem="umo-BZ-XnI" secondAttribute="leading" id="rWb-dF-LRr"/>
+                        </constraints>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="catalog" image="tab_catalog" id="Rc5-6j-hkp"/>
+                    <simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
+                    <connections>
+                        <outlet property="tableView" destination="9jX-0h-egY" id="mLh-0U-0hI"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="Aqc-j9-AGT" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="3458" y="-185"/>
+        </scene>
+        <!--FAVORITE-->
+        <scene sceneID="0j1-pO-aQc">
+            <objects>
+                <viewController storyboardIdentifier="LocalListViewController" title="FAVORITE" useStoryboardIdentifierAsRestorationIdentifier="YES" id="xRg-OK-5fG" customClass="LocalListViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="VBa-vh-JhB">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+                        <subviews>
+                            <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="-1" estimatedRowHeight="-1" sectionHeaderHeight="-1" estimatedSectionHeaderHeight="-1" sectionFooterHeight="-1" estimatedSectionFooterHeight="-1" translatesAutoresizingMaskIntoConstraints="NO" id="h5s-ra-RlS">
+                                <rect key="frame" x="0.0" y="59" width="393" height="710"/>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <prototypes>
+                                    <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" restorationIdentifier="LocalListCell" insetsLayoutMarginsFromSafeArea="NO" selectionStyle="blue" hidesAccessoryWhenEditing="NO" indentationLevel="1" indentationWidth="0.0" reuseIdentifier="LocalListCell" rowHeight="80" id="eyU-qz-PLt" customClass="LocalListCell">
+                                        <rect key="frame" x="0.0" y="50" width="393" height="80"/>
+                                        <autoresizingMask key="autoresizingMask"/>
+                                        <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="eyU-qz-PLt" id="W6S-Us-I1m">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="80"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="xTg-ID-bLX">
+                                                    <rect key="frame" x="44" y="5" width="70" height="70"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="70" id="3YC-8p-KaT"/>
+                                                        <constraint firstAttribute="width" constant="70" id="Nl3-N8-TOo"/>
+                                                    </constraints>
+                                                </imageView>
+                                                <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Label" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="jva-SR-OFc">
+                                                    <rect key="frame" x="124" y="2" width="256" height="76"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                                    <nil key="textColor"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="JAt-8d-d2c">
+                                                    <rect key="frame" x="10" y="28" width="24" height="24"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="24" id="Bir-Hh-Us2"/>
+                                                        <constraint firstAttribute="width" constant="24" id="kiL-Fu-a2C"/>
+                                                    </constraints>
+                                                    <state key="normal" title="Button"/>
+                                                    <buttonConfiguration key="configuration" style="plain" image="uncheck_24"/>
+                                                    <connections>
+                                                        <action selector="onCheckClick:" destination="eyU-qz-PLt" eventType="touchUpInside" id="xCy-sd-4Wg"/>
+                                                    </connections>
+                                                </button>
+                                                <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="ExQ-nB-SL0">
+                                                    <rect key="frame" x="353" y="10" width="30" height="60"/>
+                                                    <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="width" constant="30" id="EEW-Uj-7uS"/>
+                                                        <constraint firstAttribute="height" constant="60" id="fZd-UH-OVF"/>
+                                                    </constraints>
+                                                    <color key="tintColor" red="1" green="0.14913141730000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <state key="normal" title="Button"/>
+                                                    <buttonConfiguration key="configuration" style="plain" image="20_trash"/>
+                                                    <connections>
+                                                        <action selector="onDelClick:" destination="eyU-qz-PLt" eventType="touchUpInside" id="NjT-l1-8p8"/>
+                                                    </connections>
+                                                </button>
+                                            </subviews>
+                                            <constraints>
+                                                <constraint firstAttribute="bottom" secondItem="jva-SR-OFc" secondAttribute="bottom" constant="2" id="BYf-il-Ycv"/>
+                                                <constraint firstItem="JAt-8d-d2c" firstAttribute="leading" secondItem="W6S-Us-I1m" secondAttribute="leading" constant="10" id="GaA-gd-qAS"/>
+                                                <constraint firstItem="jva-SR-OFc" firstAttribute="leading" secondItem="xTg-ID-bLX" secondAttribute="trailing" constant="10" id="HYn-FF-MOS"/>
+                                                <constraint firstAttribute="trailing" secondItem="jva-SR-OFc" secondAttribute="trailing" constant="13" id="Sbo-fS-1In"/>
+                                                <constraint firstItem="xTg-ID-bLX" firstAttribute="leading" secondItem="JAt-8d-d2c" secondAttribute="trailing" constant="10" id="TKW-4v-hjo"/>
+                                                <constraint firstItem="ExQ-nB-SL0" firstAttribute="centerY" secondItem="W6S-Us-I1m" secondAttribute="centerY" id="WfB-Jw-rNa"/>
+                                                <constraint firstAttribute="trailing" secondItem="ExQ-nB-SL0" secondAttribute="trailing" constant="10" id="bBo-Tu-Dsw"/>
+                                                <constraint firstItem="jva-SR-OFc" firstAttribute="top" secondItem="W6S-Us-I1m" secondAttribute="top" constant="2" id="eoP-CA-zWl"/>
+                                                <constraint firstItem="xTg-ID-bLX" firstAttribute="centerY" secondItem="W6S-Us-I1m" secondAttribute="centerY" id="ikg-mg-0FV"/>
+                                                <constraint firstItem="JAt-8d-d2c" firstAttribute="centerY" secondItem="W6S-Us-I1m" secondAttribute="centerY" id="mmt-RD-0sY"/>
+                                            </constraints>
+                                        </tableViewCellContentView>
+                                        <connections>
+                                            <outlet property="btnCheck" destination="JAt-8d-d2c" id="fKK-g6-6wG"/>
+                                            <outlet property="btnDel" destination="ExQ-nB-SL0" id="cmz-Zr-o6b"/>
+                                            <outlet property="label" destination="jva-SR-OFc" id="tZ2-La-Sbu"/>
+                                            <outlet property="modelimageView" destination="xTg-ID-bLX" id="ZMQ-Ag-hg4"/>
+                                        </connections>
+                                    </tableViewCell>
+                                </prototypes>
+                                <connections>
+                                    <outlet property="dataSource" destination="xRg-OK-5fG" id="2Ay-Kw-tah"/>
+                                    <outlet property="delegate" destination="xRg-OK-5fG" id="arI-de-f8N"/>
+                                </connections>
+                            </tableView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="fGM-xY-0Q4">
+                                <rect key="frame" x="0.0" y="726" width="393" height="43"/>
+                                <subviews>
+                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="eFk-WL-VvZ">
+                                        <rect key="frame" x="293" y="4" width="90" height="35"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="90" id="ZGO-cz-ziV"/>
+                                        </constraints>
+                                        <state key="normal" title="Button"/>
+                                        <buttonConfiguration key="configuration" style="filled" title="Inquiry" cornerStyle="capsule"/>
+                                        <connections>
+                                            <action selector="onInquiryClick:" destination="xRg-OK-5fG" eventType="touchUpInside" id="F3f-jG-tts"/>
+                                        </connections>
+                                    </button>
+                                    <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="leading" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="2iK-ua-2kW">
+                                        <rect key="frame" x="0.0" y="2.6666666666666288" width="144" height="38"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="144" id="JMG-Yj-9lH"/>
+                                        </constraints>
+                                        <color key="tintColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+                                        <state key="normal" title="Button"/>
+                                        <buttonConfiguration key="configuration" style="plain" image="uncheck_24" title="Select all" imagePadding="4"/>
+                                        <connections>
+                                            <action selector="onselallClick:" destination="xRg-OK-5fG" eventType="touchUpInside" id="PG6-Y2-7wb"/>
+                                        </connections>
+                                    </button>
+                                    <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="100 item selected" textAlignment="natural" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="P94-kM-wm5">
+                                        <rect key="frame" x="154" y="11.999999999999998" width="129" height="19.333333333333329"/>
+                                        <fontDescription key="fontDescription" type="system" pointSize="16"/>
+                                        <nil key="textColor"/>
+                                        <nil key="highlightedColor"/>
+                                    </label>
+                                    <button hidden="YES" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Lxa-2g-XQR">
+                                        <rect key="frame" x="303" y="4" width="80" height="35"/>
+                                        <constraints>
+                                            <constraint firstAttribute="width" constant="80" id="WYX-Zo-lGR"/>
+                                        </constraints>
+                                        <color key="tintColor" red="1" green="0.14913141730000001" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <state key="normal" title="Button"/>
+                                        <buttonConfiguration key="configuration" style="filled" title="Delete" cornerStyle="capsule"/>
+                                        <connections>
+                                            <action selector="onDeleteClick:" destination="xRg-OK-5fG" eventType="touchUpInside" id="5tc-bg-MLy"/>
+                                        </connections>
+                                    </button>
+                                </subviews>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <constraints>
+                                    <constraint firstAttribute="height" constant="43" id="8F3-26-AvU"/>
+                                    <constraint firstAttribute="trailing" secondItem="eFk-WL-VvZ" secondAttribute="trailing" constant="10" id="8lp-4c-2C7"/>
+                                    <constraint firstItem="P94-kM-wm5" firstAttribute="leading" secondItem="2iK-ua-2kW" secondAttribute="trailing" constant="10" id="CtJ-JC-PPt"/>
+                                    <constraint firstItem="2iK-ua-2kW" firstAttribute="centerY" secondItem="fGM-xY-0Q4" secondAttribute="centerY" id="ObD-73-QpO"/>
+                                    <constraint firstItem="eFk-WL-VvZ" firstAttribute="leading" secondItem="P94-kM-wm5" secondAttribute="trailing" constant="10" id="ToB-KR-vkQ"/>
+                                    <constraint firstItem="Lxa-2g-XQR" firstAttribute="centerY" secondItem="fGM-xY-0Q4" secondAttribute="centerY" id="UDm-Uv-dDB"/>
+                                    <constraint firstItem="eFk-WL-VvZ" firstAttribute="centerY" secondItem="fGM-xY-0Q4" secondAttribute="centerY" id="hxQ-7M-sUS"/>
+                                    <constraint firstItem="P94-kM-wm5" firstAttribute="centerY" secondItem="fGM-xY-0Q4" secondAttribute="centerY" id="lFv-gX-kTd"/>
+                                    <constraint firstItem="2iK-ua-2kW" firstAttribute="leading" secondItem="fGM-xY-0Q4" secondAttribute="leading" id="t7J-4N-hCP"/>
+                                    <constraint firstAttribute="trailing" secondItem="Lxa-2g-XQR" secondAttribute="trailing" constant="10" id="wOH-Vr-GB6"/>
+                                </constraints>
+                            </view>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="sCD-fF-TlB"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="sCD-fF-TlB" firstAttribute="trailing" secondItem="h5s-ra-RlS" secondAttribute="trailing" id="R69-sR-WGa"/>
+                            <constraint firstItem="fGM-xY-0Q4" firstAttribute="leading" secondItem="sCD-fF-TlB" secondAttribute="leading" id="Wdz-C3-x7p"/>
+                            <constraint firstItem="sCD-fF-TlB" firstAttribute="trailing" secondItem="fGM-xY-0Q4" secondAttribute="trailing" id="XMO-h9-uwE"/>
+                            <constraint firstItem="sCD-fF-TlB" firstAttribute="bottom" secondItem="fGM-xY-0Q4" secondAttribute="bottom" id="bZx-29-END"/>
+                            <constraint firstItem="sCD-fF-TlB" firstAttribute="bottom" secondItem="h5s-ra-RlS" secondAttribute="bottom" id="dRg-bL-oXg"/>
+                            <constraint firstItem="h5s-ra-RlS" firstAttribute="leading" secondItem="sCD-fF-TlB" secondAttribute="leading" id="eh1-MD-Csi"/>
+                            <constraint firstItem="h5s-ra-RlS" firstAttribute="top" secondItem="sCD-fF-TlB" secondAttribute="top" id="l2N-ZY-aGq"/>
+                        </constraints>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="favorite" image="tab_favorite" id="BCA-3G-2yy"/>
+                    <simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
+                    <connections>
+                        <outlet property="btnDel" destination="Lxa-2g-XQR" id="M6c-wP-8JW"/>
+                        <outlet property="btnInquiry" destination="eFk-WL-VvZ" id="PD6-KM-wmJ"/>
+                        <outlet property="btn_selall" destination="2iK-ua-2kW" id="fMg-Ng-AQ9"/>
+                        <outlet property="label_selected" destination="P94-kM-wm5" id="W8o-Yp-haz"/>
+                        <outlet property="tableView" destination="h5s-ra-RlS" id="YQd-Ca-1fN"/>
+                        <outlet property="view_normal" destination="fGM-xY-0Q4" id="aAx-lw-pgi"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="CVY-qV-M4u" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="4316.7938931297704" y="13.380281690140846"/>
+        </scene>
+        <!--SEARCH-->
+        <scene sceneID="xrV-kJ-nek">
+            <objects>
+                <viewController storyboardIdentifier="SearchViewController" title="SEARCH" useStoryboardIdentifierAsRestorationIdentifier="YES" id="xLX-OU-P8w" customClass="SearchViewController" sceneMemberID="viewController">
+                    <view key="view" contentMode="scaleToFill" id="rgI-cJ-dW5">
+                        <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+                        <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+                        <subviews>
+                            <collectionView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" showsHorizontalScrollIndicator="NO" minimumZoomScale="0.0" maximumZoomScale="0.0" dataMode="prototypes" translatesAutoresizingMaskIntoConstraints="NO" id="dBJ-94-EcG">
+                                <rect key="frame" x="0.0" y="103" width="393" height="749"/>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                                <collectionViewFlowLayout key="collectionViewLayout" minimumLineSpacing="0.0" minimumInteritemSpacing="0.0" id="G5x-Dx-uhA">
+                                    <size key="itemSize" width="175" height="250"/>
+                                    <size key="headerReferenceSize" width="0.0" height="0.0"/>
+                                    <size key="footerReferenceSize" width="0.0" height="0.0"/>
+                                    <inset key="sectionInset" minX="0.0" minY="0.0" maxX="0.0" maxY="0.0"/>
+                                </collectionViewFlowLayout>
+                                <cells>
+                                    <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" restorationIdentifier="CatalogCellSmall" reuseIdentifier="CatalogCellSmall" id="v1u-rb-H7o" customClass="CatalogCellSmall">
+                                        <rect key="frame" x="106.66666666666667" y="0.0" width="180" height="251"/>
+                                        <autoresizingMask key="autoresizingMask" flexibleMinY="YES"/>
+                                        <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
+                                            <rect key="frame" x="0.0" y="0.0" width="180" height="251"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="$139.99" textAlignment="center" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="5of-oZ-z2S">
+                                                    <rect key="frame" x="0.0" y="220" width="180" height="21"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="21" id="NOF-rI-12g"/>
+                                                    </constraints>
+                                                    <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name&amp;Description" textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="uAj-Am-v0N">
+                                                    <rect key="frame" x="5" y="156" width="170" height="64"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="15"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="NTc-TE-dXh">
+                                                    <rect key="frame" x="15" y="6" width="150" height="150"/>
+                                                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="150" id="AwZ-9o-JhL"/>
+                                                        <constraint firstAttribute="width" constant="150" id="ZZp-Cb-jBH"/>
+                                                        <constraint firstAttribute="width" secondItem="NTc-TE-dXh" secondAttribute="height" multiplier="1:1" id="euz-hJ-68d"/>
+                                                    </constraints>
+                                                </imageView>
+                                                <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="24_closeout" translatesAutoresizingMaskIntoConstraints="NO" id="aDn-u3-wlY" userLabel="ic_closeout">
+                                                    <rect key="frame" x="146" y="10" width="24" height="24"/>
+                                                    <color key="tintColor" systemColor="systemRedColor"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="width" constant="24" id="2YM-4J-gig"/>
+                                                        <constraint firstAttribute="height" constant="24" id="6IV-xQ-bc2"/>
+                                                    </constraints>
+                                                </imageView>
+                                            </subviews>
+                                        </view>
+                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <constraints>
+                                            <constraint firstItem="5of-oZ-z2S" firstAttribute="top" secondItem="uAj-Am-v0N" secondAttribute="bottom" id="1Yb-df-RrR"/>
+                                            <constraint firstAttribute="trailing" secondItem="5of-oZ-z2S" secondAttribute="trailing" id="5CE-bE-kM7"/>
+                                            <constraint firstAttribute="trailing" secondItem="aDn-u3-wlY" secondAttribute="trailing" constant="10" id="8Ga-7G-PSU"/>
+                                            <constraint firstItem="uAj-Am-v0N" firstAttribute="leading" secondItem="v1u-rb-H7o" secondAttribute="leading" constant="5" id="9pt-Au-5OE"/>
+                                            <constraint firstItem="uAj-Am-v0N" firstAttribute="top" secondItem="NTc-TE-dXh" secondAttribute="bottom" id="D5c-gV-cUy"/>
+                                            <constraint firstItem="5of-oZ-z2S" firstAttribute="leading" secondItem="v1u-rb-H7o" secondAttribute="leading" id="E2i-aR-iP4"/>
+                                            <constraint firstAttribute="bottom" secondItem="5of-oZ-z2S" secondAttribute="bottom" constant="10" id="cbF-t0-vQS"/>
+                                            <constraint firstAttribute="trailing" secondItem="uAj-Am-v0N" secondAttribute="trailing" constant="5" id="dzL-S5-P1i"/>
+                                            <constraint firstItem="aDn-u3-wlY" firstAttribute="top" secondItem="v1u-rb-H7o" secondAttribute="top" constant="10" id="h5g-5c-YEZ"/>
+                                            <constraint firstItem="NTc-TE-dXh" firstAttribute="top" secondItem="v1u-rb-H7o" secondAttribute="top" constant="6" id="nWb-tF-CxH"/>
+                                            <constraint firstItem="NTc-TE-dXh" firstAttribute="centerX" secondItem="v1u-rb-H7o" secondAttribute="centerX" id="yvS-i9-YfP"/>
+                                        </constraints>
+                                        <size key="customSize" width="180" height="251"/>
+                                        <connections>
+                                            <outlet property="cellImageView" destination="NTc-TE-dXh" id="aFT-2v-JCP"/>
+                                            <outlet property="ic_closeout" destination="aDn-u3-wlY" id="XM0-Dq-Pmn"/>
+                                            <outlet property="modelNoLabel" destination="5of-oZ-z2S" id="iJN-1D-wQW"/>
+                                            <outlet property="nameLabel" destination="uAj-Am-v0N" id="j8A-XK-36O"/>
+                                        </connections>
+                                    </collectionViewCell>
+                                    <collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" restorationIdentifier="CatalogCellList" reuseIdentifier="CatalogCellList" id="X2p-as-32M" customClass="CatalogCellSmall">
+                                        <rect key="frame" x="0.0" y="251" width="393" height="80"/>
+                                        <autoresizingMask key="autoresizingMask" flexibleMinY="YES"/>
+                                        <view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" insetsLayoutMarginsFromSafeArea="NO">
+                                            <rect key="frame" x="0.0" y="0.0" width="393" height="80"/>
+                                            <autoresizingMask key="autoresizingMask"/>
+                                            <subviews>
+                                                <imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="Lj2-XK-Xlz">
+                                                    <rect key="frame" x="5" y="5" width="70" height="70"/>
+                                                    <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="width" constant="70" id="BIv-th-hba"/>
+                                                        <constraint firstAttribute="height" constant="70" id="XUf-lv-lgU"/>
+                                                    </constraints>
+                                                </imageView>
+                                                <imageView hidden="YES" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="18_closeout" translatesAutoresizingMaskIntoConstraints="NO" id="vtl-bR-nVd" userLabel="ic_closeout">
+                                                    <rect key="frame" x="61" y="4" width="18" height="18"/>
+                                                    <color key="tintColor" systemColor="systemRedColor"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="18" id="8aU-HG-1Iz"/>
+                                                        <constraint firstAttribute="width" constant="18" id="qYw-EC-6os"/>
+                                                    </constraints>
+                                                </imageView>
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="$139.99" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="OOK-6c-lcs">
+                                                    <rect key="frame" x="87" y="54" width="294" height="21"/>
+                                                    <constraints>
+                                                        <constraint firstAttribute="height" constant="21" id="Wcc-3h-YW7"/>
+                                                    </constraints>
+                                                    <fontDescription key="fontDescription" type="boldSystem" pointSize="17"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                                <label opaque="NO" clipsSubviews="YES" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Name&amp;Description" lineBreakMode="tailTruncation" numberOfLines="3" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="ThN-Rb-kvd">
+                                                    <rect key="frame" x="87" y="5" width="294" height="49"/>
+                                                    <fontDescription key="fontDescription" type="system" pointSize="14"/>
+                                                    <nil key="highlightedColor"/>
+                                                </label>
+                                            </subviews>
+                                        </view>
+                                        <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                        <constraints>
+                                            <constraint firstItem="ThN-Rb-kvd" firstAttribute="leading" secondItem="Lj2-XK-Xlz" secondAttribute="trailing" constant="12" id="1hZ-6Z-KFk"/>
+                                            <constraint firstAttribute="trailing" secondItem="OOK-6c-lcs" secondAttribute="trailing" constant="12" id="Buk-0E-h70"/>
+                                            <constraint firstItem="OOK-6c-lcs" firstAttribute="leading" secondItem="Lj2-XK-Xlz" secondAttribute="trailing" constant="12" id="Htz-54-30a"/>
+                                            <constraint firstItem="Lj2-XK-Xlz" firstAttribute="trailingMargin" secondItem="vtl-bR-nVd" secondAttribute="trailing" constant="-12" id="O3g-Ol-m2N"/>
+                                            <constraint firstItem="ThN-Rb-kvd" firstAttribute="top" secondItem="Lj2-XK-Xlz" secondAttribute="top" id="OkH-xN-Odz"/>
+                                            <constraint firstItem="OOK-6c-lcs" firstAttribute="top" secondItem="ThN-Rb-kvd" secondAttribute="bottom" id="QrU-S2-ZWg"/>
+                                            <constraint firstItem="OOK-6c-lcs" firstAttribute="bottom" secondItem="Lj2-XK-Xlz" secondAttribute="bottom" id="USp-pg-GWu"/>
+                                            <constraint firstItem="Lj2-XK-Xlz" firstAttribute="leading" secondItem="X2p-as-32M" secondAttribute="leading" constant="5" id="cON-5d-o2x"/>
+                                            <constraint firstItem="vtl-bR-nVd" firstAttribute="top" secondItem="X2p-as-32M" secondAttribute="top" constant="4" id="dMh-mV-AM5"/>
+                                            <constraint firstItem="Lj2-XK-Xlz" firstAttribute="centerY" secondItem="X2p-as-32M" secondAttribute="centerY" id="u2J-6U-0o4"/>
+                                            <constraint firstAttribute="trailing" secondItem="ThN-Rb-kvd" secondAttribute="trailing" constant="12" id="vrh-03-YpQ"/>
+                                        </constraints>
+                                        <size key="customSize" width="393" height="80"/>
+                                        <connections>
+                                            <outlet property="cellImageView" destination="Lj2-XK-Xlz" id="GIz-Bn-BfX"/>
+                                            <outlet property="ic_closeout" destination="vtl-bR-nVd" id="rkG-xk-n33"/>
+                                            <outlet property="modelNoLabel" destination="OOK-6c-lcs" id="LaY-5J-CF8"/>
+                                            <outlet property="nameLabel" destination="ThN-Rb-kvd" id="gc9-tm-dYF"/>
+                                        </connections>
+                                    </collectionViewCell>
+                                </cells>
+                                <connections>
+                                    <outlet property="dataSource" destination="xLX-OU-P8w" id="g5a-OX-gOf"/>
+                                    <outlet property="delegate" destination="xLX-OU-P8w" id="nr6-w5-i08"/>
+                                </connections>
+                            </collectionView>
+                            <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Hoi-hS-2dQ" customClass="CategoryHeaderView">
+                                <rect key="frame" x="0.0" y="59" width="393" height="44"/>
+                                <subviews>
+                                    <button opaque="NO" tag="4" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="3bZ-as-GX8" userLabel="Display_list">
+                                        <rect key="frame" x="353" y="10" width="24" height="24"/>
+                                        <constraints>
+                                            <constraint firstAttribute="height" constant="24" id="9XX-B2-sIr"/>
+                                            <constraint firstAttribute="width" constant="24" id="jW3-vB-2b5"/>
+                                        </constraints>
+                                        <state key="normal" title="Button" image="24_layout_list"/>
+                                        <connections>
+                                            <action selector="onChangeDisplay:" destination="xLX-OU-P8w" eventType="touchUpInside" id="Ilw-FF-qPF"/>
+                                        </connections>
+                                    </button>
+                                    <searchBar contentMode="redraw" searchBarStyle="minimal" translatesAutoresizingMaskIntoConstraints="NO" id="5gg-fB-PIL">
+                                        <rect key="frame" x="8" y="0.0" width="329" height="44"/>
+                                        <textInputTraits key="textInputTraits"/>
+                                        <scopeButtonTitles>
+                                            <string>Title</string>
+                                            <string>Title</string>
+                                        </scopeButtonTitles>
+                                        <connections>
+                                            <outlet property="delegate" destination="xLX-OU-P8w" id="vGu-ke-JrT"/>
+                                        </connections>
+                                    </searchBar>
+                                </subviews>
+                                <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <constraints>
+                                    <constraint firstAttribute="trailing" secondItem="3bZ-as-GX8" secondAttribute="trailing" constant="16" id="5KN-Fx-MJS"/>
+                                    <constraint firstItem="5gg-fB-PIL" firstAttribute="top" secondItem="Hoi-hS-2dQ" secondAttribute="top" id="8UA-aV-FuC"/>
+                                    <constraint firstItem="3bZ-as-GX8" firstAttribute="leading" secondItem="5gg-fB-PIL" secondAttribute="trailing" constant="16" id="BTE-dL-M9R"/>
+                                    <constraint firstAttribute="bottom" secondItem="5gg-fB-PIL" secondAttribute="bottom" id="CVz-vF-d5e"/>
+                                    <constraint firstAttribute="height" constant="44" id="JVm-uT-rlU"/>
+                                    <constraint firstItem="3bZ-as-GX8" firstAttribute="centerY" secondItem="Hoi-hS-2dQ" secondAttribute="centerY" id="joV-WI-Idf"/>
+                                    <constraint firstItem="5gg-fB-PIL" firstAttribute="leading" secondItem="Hoi-hS-2dQ" secondAttribute="leading" constant="8" id="lgZ-Qw-Ahe"/>
+                                </constraints>
+                            </view>
+                            <activityIndicatorView hidden="YES" opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" hidesWhenStopped="YES" animating="YES" style="whiteLarge" translatesAutoresizingMaskIntoConstraints="NO" id="xdV-HI-3qN">
+                                <rect key="frame" x="178" y="407.66666666666669" width="37" height="37"/>
+                                <color key="color" red="0.59999999999999998" green="0.40000000000000002" blue="0.20000000000000001" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                            </activityIndicatorView>
+                            <view hidden="YES" contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="cEb-t7-0HZ">
+                                <rect key="frame" x="0.0" y="103" width="393" height="666"/>
+                                <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                            </view>
+                            <label hidden="YES" opaque="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="Cannot get data from server.
Tap to try again." textAlignment="center" lineBreakMode="tailTruncation" numberOfLines="2" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="24M-d8-w7j">
+                                <rect key="frame" x="75.666666666666671" y="403.33333333333331" width="241.66666666666663" height="45.666666666666686"/>
+                                <fontDescription key="fontDescription" type="system" pointSize="19"/>
+                                <color key="textColor" red="0.33333333329999998" green="0.33333333329999998" blue="0.33333333329999998" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+                                <nil key="highlightedColor"/>
+                            </label>
+                        </subviews>
+                        <viewLayoutGuide key="safeArea" id="FMu-mx-FDL"/>
+                        <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+                        <constraints>
+                            <constraint firstItem="FMu-mx-FDL" firstAttribute="trailing" secondItem="cEb-t7-0HZ" secondAttribute="trailing" id="4hH-Hk-Ecg"/>
+                            <constraint firstItem="FMu-mx-FDL" firstAttribute="bottom" secondItem="cEb-t7-0HZ" secondAttribute="bottom" id="5NR-nW-LRb"/>
+                            <constraint firstItem="24M-d8-w7j" firstAttribute="centerY" secondItem="rgI-cJ-dW5" secondAttribute="centerY" id="68q-Ml-dRA"/>
+                            <constraint firstItem="Hoi-hS-2dQ" firstAttribute="top" secondItem="FMu-mx-FDL" secondAttribute="top" id="7dQ-fe-Pk5"/>
+                            <constraint firstItem="cEb-t7-0HZ" firstAttribute="top" secondItem="Hoi-hS-2dQ" secondAttribute="bottom" id="8Ao-pE-MDu"/>
+                            <constraint firstItem="Hoi-hS-2dQ" firstAttribute="leading" secondItem="FMu-mx-FDL" secondAttribute="leading" id="HMk-QC-VyI"/>
+                            <constraint firstItem="xdV-HI-3qN" firstAttribute="centerY" secondItem="rgI-cJ-dW5" secondAttribute="centerY" id="Npx-53-p7a"/>
+                            <constraint firstItem="xdV-HI-3qN" firstAttribute="centerX" secondItem="FMu-mx-FDL" secondAttribute="centerX" id="PZF-RY-R9Y"/>
+                            <constraint firstAttribute="bottom" secondItem="dBJ-94-EcG" secondAttribute="bottom" id="Xis-Nt-6xg"/>
+                            <constraint firstItem="dBJ-94-EcG" firstAttribute="leading" secondItem="FMu-mx-FDL" secondAttribute="leading" id="XzA-OM-ijL"/>
+                            <constraint firstItem="24M-d8-w7j" firstAttribute="centerX" secondItem="FMu-mx-FDL" secondAttribute="centerX" id="aPp-D9-6N5"/>
+                            <constraint firstItem="dBJ-94-EcG" firstAttribute="top" secondItem="Hoi-hS-2dQ" secondAttribute="bottom" id="bjP-Na-yyf"/>
+                            <constraint firstItem="cEb-t7-0HZ" firstAttribute="leading" secondItem="FMu-mx-FDL" secondAttribute="leading" id="dey-3z-xVF"/>
+                            <constraint firstItem="dBJ-94-EcG" firstAttribute="trailing" secondItem="FMu-mx-FDL" secondAttribute="trailing" id="hFS-fN-zQC"/>
+                            <constraint firstItem="Hoi-hS-2dQ" firstAttribute="trailing" secondItem="FMu-mx-FDL" secondAttribute="trailing" id="hGQ-T0-Sla"/>
+                        </constraints>
+                    </view>
+                    <tabBarItem key="tabBarItem" title="SEARCH" image="tab_search" id="2kt-io-Qi2"/>
+                    <simulatedTabBarMetrics key="simulatedBottomBarMetrics"/>
+                    <connections>
+                        <outlet property="btnDisplay" destination="3bZ-as-GX8" id="NI4-te-ZeY"/>
+                        <outlet property="collectionview" destination="dBJ-94-EcG" id="h2w-SF-HIG"/>
+                        <outlet property="headerView" destination="Hoi-hS-2dQ" id="KTz-6y-S1O"/>
+                        <outlet property="label_net_err" destination="24M-d8-w7j" id="aoy-QE-xU2"/>
+                        <outlet property="maskView" destination="cEb-t7-0HZ" id="cHc-sO-osX"/>
+                        <outlet property="mum" destination="xdV-HI-3qN" id="x8f-Ue-I9L"/>
+                    </connections>
+                </viewController>
+                <placeholder placeholderIdentifier="IBFirstResponder" id="1Wh-E8-bf2" userLabel="First Responder" sceneMemberID="firstResponder"/>
+            </objects>
+            <point key="canvasLocation" x="-2725.9541984732823" y="438.73239436619718"/>
+        </scene>
+    </scenes>
+    <resources>
+        <image name="18_closeout" width="18" height="18"/>
+        <image name="20_trash" width="20" height="20"/>
+        <image name="24_closeout" width="24" height="24"/>
+        <image name="24_layout_list" width="24" height="24"/>
+        <image name="tab_cart" width="30" height="30"/>
+        <image name="tab_catalog" width="30" height="30"/>
+        <image name="tab_favorite" width="30" height="30"/>
+        <image name="tab_home" width="30" height="30"/>
+        <image name="tab_my" width="30" height="30"/>
+        <image name="tab_search" width="30" height="30"/>
+        <image name="uncheck_24" width="24" height="24"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+        <systemColor name="systemRedColor">
+            <color red="1" green="0.23137254901960785" blue="0.18823529411764706" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+        </systemColor>
+    </resources>
+</document>

+ 16 - 0
RedAnt iShop/iShop/RootFrame/FrameRoot.h

@@ -0,0 +1,16 @@
+//
+//  FrameRoot.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface FrameRoot : UITabBarController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 61 - 0
RedAnt iShop/iShop/RootFrame/FrameRoot.m

@@ -0,0 +1,61 @@
+//
+//  FrameRoot.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import "FrameRoot.h"
+
+@interface FrameRoot ()
+
+@end
+
+@implementation FrameRoot
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    NSArray* tabjson =(NSArray*) [self dictionaryFileName:@"tab.json"];
+    
+    
+    NSMutableArray* tab = [NSMutableArray new];
+    for(int i=0;i<tabjson.count;i++)
+    {
+        NSDictionary* item = tabjson[i];
+        UIViewController* vc = [[UIStoryboard storyboardWithName:@"Frame" bundle:nil] instantiateViewControllerWithIdentifier:item[@"Identifier"]];
+        
+        UINavigationController* navi = [[UINavigationController alloc] initWithRootViewController:vc] ;
+        
+        [tab addObject:navi];
+        //        Class class =NSClassFromString(item[@"class"]);
+                //        [[class alloc] initWithNibName:@"" bundle:nil];
+
+    }
+    
+    self.viewControllers = tab;
+    
+    
+}
+
+
+
+- (NSMutableDictionary *)dictionaryFileName:(NSString *)name {
+    NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:nil];
+    NSData *data = [NSData dataWithContentsOfFile:path];
+    NSMutableDictionary *ret = [[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil] mutableCopy];
+    
+    return ret;
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 25 - 0
RedAnt iShop/iShop/RootFrame/HomeViewController.h

@@ -0,0 +1,25 @@
+//
+//  HomeViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "TabViewController.h"
+#import "RAUtils.h"
+
+#import "HomeTableViewCellTopic.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface HomeViewController : TabViewController<HomeTableViewCellTopicDelegate>
+@property (weak, nonatomic) IBOutlet UITableView *tableView;
+
+@property (strong,nonatomic) NSDictionary* content;
+
+@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *mum;
+@property (weak, nonatomic) IBOutlet UILabel *label_net_err;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 894 - 0
RedAnt iShop/iShop/RootFrame/HomeViewController.m

@@ -0,0 +1,894 @@
+//
+//  HomeViewController.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import "HomeViewController.h"
+#import "RANetwork.h"
+#import "HomeTableViewCellSlide.h"
+#import "HomeTableViewCellButtonBanner.h"
+#import "HomeTableViewCellBanner.h"
+
+#import "SliderPage.h"
+#import "FileCache.h"
+#import "ImageUtils.h"
+#import "ItemSearchViewController.h"
+#import "CatalogListViewController.h"
+#import "WebViewController.h"
+
+@interface HomeViewController ()
+
+@end
+
+@implementation HomeViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    // Do any additional setup after loading the view.
+    
+    dispatch_async(dispatch_get_main_queue(), ^{
+    [RANetwork request_category:^(NSMutableDictionary *result) {
+        NSDictionary* category=result;
+        if([[category valueForKey:@"result"] intValue]==2)
+        {
+            
+            RASingleton.sharedInstance.categoryMenu =category;
+        }
+    }];
+        
+        
+    });
+    return;
+
+}
+
+
+-(void) LoadData
+{
+    dispatch_async(dispatch_get_main_queue(), ^{
+        if(self.isrefreshing)
+        {
+            return;
+        }
+        self.isrefreshing=true;
+        DebugLog(@"HOMEVIEW BEGIN LOAD");
+        
+        self.mum.hidden = false;
+        [self.mum startAnimating];
+        self.mum.center = self.view.center;
+
+        self.label_net_err.hidden=true;
+        
+        self.tableView.hidden=true;
+        
+        
+        [RANetwork request_home:0 customid:0 completionHandler:^(NSMutableDictionary *result) {
+            [self.mum stopAnimating];
+            NSMutableDictionary* data=result;
+            self.content = data;
+            [self.tableView reloadData];
+            self.tableView.hidden=false;
+            if([[data valueForKey:@"result"] intValue]==2)
+            {
+                DebugLog(@"HOMEVIEW JSON LOADED!");
+                
+            }
+            else
+                if([[data valueForKey:@"result"] intValue]==RESULT_NET_ERROR)
+                {
+                    self.label_net_err.hidden=false;
+                }
+                else
+                {
+                    
+                    [RAUtils message_box:@"Loading Home" message:[data valueForKey:@"err_msg"]  completion:nil];
+                }
+            
+            self.isrefreshing=false;
+            
+            ;
+        }];
+        return;
+    });
+}
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+
+
+-(void) dealloc
+{
+    DebugLog(@"HOME VIEWCONTROLLER DEALLOC");
+}
+-(void) refresh_on_login
+{
+    // do not refresh on login;
+}
+
+- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
+{
+    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
+    if (self) {
+        // Custom initialization
+    }
+    return self;
+}
+- (void)viewWillAppear:(BOOL)animated
+{
+    [super viewWillAppear:animated];
+//    [[self navigationController] setNavigationBarHidden:YES animated:NO];
+    
+//    if(!CGSizeEqualToSize(self.ori_size, [[UIScreen mainScreen] bounds].size))
+//    {
+//            [self.tableView reloadData];
+//    }
+//    self.content = self.bak_content;
+//    [self reload_container_getdata:false];
+}
+-(void) viewWillDisappear:(BOOL)animated
+{
+    
+//    self.ori_size=[[UIScreen mainScreen] bounds].size;
+//                                            [[NSNotificationCenter defaultCenter] postNotificationName:CYCLESCROLL_STOPTIMMER object:nil];
+//    self.bak_content = self.content;
+//    self.content= nil;
+////    self.homeTable re
+//    [self.homeTable reloadData];
+    
+}
+-(void)manually_refresh
+{
+    
+    UIRefreshControl *reF = (UIRefreshControl *)[self.view viewWithTag:200];
+    
+    if(self.isrefreshing)
+    {
+        [reF endRefreshing];
+        return;
+    }
+    reF.attributedTitle = [[NSAttributedString alloc]initWithString:@"Refreshing"];
+    [self performSelector:@selector(ReloadData) withObject:nil afterDelay:1];
+    //    DebugLog(@"refresh!!!!!!!!");
+    
+}
+
+-(void) ReloadData
+{
+    UIRefreshControl *reF = (UIRefreshControl *)[self.view viewWithTag:200];
+    
+    [reF endRefreshing];
+    
+    reF.attributedTitle = [[NSAttributedString alloc]initWithString:@"Pull to refresh"];
+    [self LoadData];
+    
+    
+}
+//
+//- (void)viewDidLoad
+//{
+//    [super viewDidLoad];
+//    
+//    self.label_net_err.layer.borderColor = [UIColor darkGrayColor].CGColor;
+//    self.label_net_err.layer.borderWidth = 2.0;
+//    self.label_net_err.layer.cornerRadius=15;
+//    self.label_net_err.layer.masksToBounds=true;
+//    
+//    
+//    
+//    
+//    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(refresh_btn_click:)];
+//    //            tap.minimumPressDuration = 0.8; //定义按的时间
+//    [self.label_net_err addGestureRecognizer:tap];
+//    
+//    
+//    //    [[self navigationController] setNavigationBarHidden:YES animated:NO];
+//    
+//    UIRefreshControl *ref = [[UIRefreshControl alloc]init];
+//    ref.tag = 200 ;
+//    ref.attributedTitle = [[NSAttributedString alloc]initWithString:@"Pull to refresh"];
+//    ref.tintColor = [UIColor colorWithRed:0.10 green:0.68 blue:0.94 alpha:0.7];
+//    //    ref.hidden = true;
+//    [ref addTarget:self action:@selector(manually_refresh) forControlEvents:UIControlEventValueChanged];
+//    [self.homeTable addSubview:ref];
+//    
+//    
+//    
+//    
+//    
+//    
+////    
+////    RATreeView *treeView = [[RATreeView alloc] initWithFrame:self.treeContainer.frame];
+////    
+////    treeView.delegate = self;
+////    treeView.dataSource = self;
+////    treeView.separatorStyle = RATreeViewCellSeparatorStyleSingleLine;
+////    
+////    [treeView reloadData];
+////    //  [treeView expandRowForItem:phone withRowAnimation:RATreeViewRowAnimationLeft]; //expands Row
+////    [treeView setBackgroundColor:UIColorFromRGB(0xF7F7F7)];
+////    
+////    self.treeView = treeView;
+////    [self.treeContainer addSubview:treeView];
+//    
+//    //   UIApplication * app = [UIApplication sharedApplication];
+//    
+//    
+//    
+//}
+
+-(void)viewDidAppear:(BOOL)animated
+{
+    [super viewDidAppear:animated];
+    
+    //    CGRect rt = self.treeContainer.bounds;
+    //    CGRect rt1 = self.treeContainer.frame;
+//    self.treeView.frame = self.treeContainer.bounds;
+    
+   
+    
+}
+- (void)didReceiveMemoryWarning
+{
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator {
+    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
+    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
+        // what ever you want to prepare
+    } completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
+        [self.tableView reloadData];
+    }];
+}
+#pragma mark - Table view data source
+- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath
+{
+    if([cell isKindOfClass:[HomeTableViewCellSlide class]])
+    {
+        HomeTableViewCellSlide* slidecell=(HomeTableViewCellSlide*)cell;
+        [slidecell.imgScroll stopTimmer];
+    }
+}
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+
+    
+    NSDictionary* view_json = [self.content objectForKey:[NSString stringWithFormat:@"view_%ld",(long)indexPath.section ]];
+    
+    NSString* type = [view_json valueForKeyPath:@"type"];
+    if([type isEqualToString:@"slideview"])
+    {
+     
+        
+        int i_width = [[view_json valueForKey:@"width"]intValue];
+        int i_height = [[view_json valueForKey:@"height"]intValue];
+        if(i_width<=0||i_height<=0)
+        {
+            i_width=981;
+        
+            i_height=512;
+        }
+        int ui_height = (tableView.frame.size.width * i_height)/i_width;
+        return ui_height;
+        
+    }
+    else if([type isEqualToString:@"topicview"])
+    {
+        return 310;
+    }
+    else if([type isEqualToString:@"banner"])
+    {
+
+        
+        int i_width = 498;
+        int i_height = 197;
+        
+        int ui_height = (tableView.frame.size.width * i_height)/i_width;
+        return ui_height;
+        
+    }
+    else if([type isEqualToString:@"button_banner"])
+    {
+        int i_width = [[view_json valueForKey:@"width"]intValue];
+        int i_height = [[view_json valueForKey:@"height"]intValue];
+        float ui_height = (tableView.frame.size.width * i_height)/(float)i_width;
+        return ui_height;
+    }
+    
+    return 44;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
+{
+    
+    //-----debug!!
+    //    if(self.content !=nil)
+    //        return 2;
+    return [[self.content valueForKeyPath:@"count"]intValue];
+}
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
+{
+    
+    return 1;
+    
+    
+}
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+{
+//    
+//    
+//    
+//    
+//    
+//    
+//    
+//    
+//    
+//    NSDictionary* view_json = [self.content objectForKey:[NSString stringWithFormat:@"view_%ld",(long)indexPath.section ]];
+//    
+//    //    NSString* type = [view_json valueForKeyPath:@"type"];
+//    
+//    NSString* action = [view_json valueForKeyPath:@"action"];
+//    
+//    if([action isEqualToString:@"itemSearch"])
+//    {
+//        
+//        ItemSearchViewController* isvc =[ [UIStoryboard storyboardWithName:@"itemsearch" bundle:nil] instantiateViewControllerWithIdentifier:@"ItemSearchViewController"];
+//        NSString* covertype = [view_json valueForKeyPath:@"covertype"];
+//        
+//        
+//        
+//        
+////        isvc.default_filter = nil;
+//        isvc.covertype = covertype;
+////        isvc.saved_covertype = coverttype;
+//        
+//        
+//        
+//        isvc.p_available = nil;
+//        isvc.p_price = nil;
+//        isvc.p_QTY = nil;
+//        isvc.p_bestseller = nil;
+//
+////        [ActiveViewController Notify:@"ItemSearchViewController" Message:RA_NOTIFICATION_RELOAD_DATA];
+//
+//        
+//        [[self navigationController] pushViewController:isvc animated:true];
+////        [ setNavigationBarHidden:YES animated:NO];
+//        
+//        
+//        
+////
+////        UIApplication * app = [UIApplication sharedApplication];
+////        AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+////        MainViewController* main_vc=(MainViewController*)appDelegate.main_vc;
+////        
+////        [main_vc switchToItemSearch:covertype];
+//    }
+//    
+    
+}
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
+{
+    
+    UITableViewCell *cell = nil;
+    
+    NSDictionary* view_json = [self.content objectForKey:[NSString stringWithFormat:@"view_%ld",(long)indexPath.section ]];
+    
+    NSString* type = [view_json valueForKeyPath:@"type"];
+    if([type isEqualToString:@"slideview"])
+    {
+        NSString *CellIdentifier = @"HomeTableViewCellSlide";
+        cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
+        
+        HomeTableViewCellSlide* slidecell = (HomeTableViewCellSlide*)cell;
+        
+        [slidecell.imgScroll stopTimmer];
+        [slidecell.imgScroll removeFromSuperview];
+//        for(UIView* v in cell.contentView.subviews)
+//        {
+//            [v removeFromSuperview];
+//
+//        }
+        
+//        int i_width = 981;
+//        int i_height = 512;
+        //如果模版有高度就用模版设置值,没有则用默认值。
+        int i_width = [[view_json valueForKey:@"width"]intValue];
+        int i_height = [[view_json valueForKey:@"height"]intValue];
+        if(i_width<=0||i_height<=0)
+        {
+            i_width=981;
+            i_height=512;
+        }
+        
+            
+
+        int ui_height = (tableView.frame.size.width * i_height)/i_width;
+        
+//        HomeTableViewCellSlide* slidecell = (HomeTableViewCellSlide*)cell;
+        //        imgScroll.tag = 1394;
+        //
+        //
+        //        for (UIView *v in cell.contentView.subviews) {
+        //            if(v.tag==1394)
+        //                [v removeFromSuperview];
+        //        }
+        
+        
+        
+        CycleScrollView *imgScroll =  [[CycleScrollView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, ui_height)  animationDuration:5];
+        
+        imgScroll.autoresizingMask =     UIViewAutoresizingFlexibleHeight  |UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin;
+        int slide_item_count = [[view_json valueForKey:@"count"] intValue];
+        
+        //imgScroll.frame =CGRectMake(0, 5, width, 300);
+        [imgScroll reset];
+        
+//        [imgScroll animationDuration:5];
+        imgScroll.backgroundColor = [[UIColor purpleColor] colorWithAlphaComponent:0.1];
+        
+        for(int i = 0;i<slide_item_count;i++)
+        {
+            NSDictionary * slide_itemjson =[view_json objectForKey:[NSString stringWithFormat:@"item_%d",i] ];
+            
+            
+            SliderPage * tempview = [[SliderPage alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, ui_height)];
+            tempview.autoresizingMask =    UIViewAutoresizingFlexibleHeight  |UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleTopMargin|UIViewAutoresizingFlexibleBottomMargin;
+            NSString* img_url = [slide_itemjson valueForKey:@"img"];
+            
+            
+            tempview.contentMode = UIViewContentModeScaleToFill;
+            tempview.img_url = img_url;
+            //                tempview.url =@"";
+            //                tempview.action_type = ;
+            //                tempview.params = ;
+            
+            [imgScroll addPage:tempview];
+            
+            
+            
+        }
+        
+        
+        [imgScroll setTotalPagesCount];
+        imgScroll.TapActionBlock = ^(NSInteger pageIndex){
+            DebugLog(@"点击了第%ld个",(long)pageIndex);
+            NSDictionary * item_json =[view_json objectForKey:[NSString stringWithFormat:@"item_%ld",pageIndex] ];
+            NSString* action = [item_json valueForKeyPath:@"action"];
+            
+//            [RASingleton sharedInstance].homeClickedItemName = @"slide_view";
+//            
+//
+//                if([action isEqualToString:@"category"])
+//            {
+//                [RASingleton sharedInstance].homeItemClick = YES;
+//                NSString* cid = [item_json valueForKeyPath:@"category_id"];
+//                
+//                UIApplication * app = [UIApplication sharedApplication];
+//                AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+//                MainViewController* main_vc=(MainViewController*)appDelegate.main_vc;
+//                
+//                [main_vc switchToCagegory:cid];
+//            }
+          
+        };
+     
+//
+        slidecell.imgScroll = imgScroll;
+//        return cell;
+        [cell.contentView addSubview:imgScroll];
+        
+        
+        
+    }
+    else if([type isEqualToString:@"topicview"])
+    {
+        
+        NSString *CellIdentifier = @"HomeTableViewCellTopic";
+        
+        
+        
+        // NSDictionary* section_json = [self.detail_data objectForKey:@"related_model"];
+        HomeTableViewCellTopic * cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
+        cell.itemdelegate = self;
+        cell.related_data = view_json;
+        [cell.topicCollectionView reloadData];
+        
+        
+        
+         
+        NSString * topictitle =[view_json valueForKey:@"title"];
+        cell.label_title.text =topictitle;
+        
+        cell.backgroundColor = [UIColor whiteColor];
+        return cell;
+        
+    }
+    else if([type isEqualToString:@"banner"])
+    {
+        
+        NSString *CellIdentifier = @"HomeTableViewCellBanner";
+//        cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
+//
+//        HomeTableViewCellBanner * bannercell=cell;
+        
+        
+        
+        HomeTableViewCellBanner * bannercell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];;
+        NSString* img_url =[view_json valueForKeyPath:@"img"];
+        NSString* file_name=[img_url lastPathComponent];
+        NSData* img_data=[ImageUtils load_cached_img:file_name loadFrom:img_url size:bannercell.BannerImageView.frame.size allow_enlarge:false];
+        if(img_data!=nil)
+        {
+            
+            UIImage * img =[UIImage imageWithData:img_data];
+            bannercell.BannerImageView.image = img;
+        }
+        else
+        {
+            
+            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+                
+                NSData*  downloadimg_data = [NSData dataWithContentsOfURL:[NSURL URLWithString:img_url]];
+                
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    
+                    
+                    
+                    if(downloadimg_data!=nil)
+                    {
+                        
+                        [FileCache cache_img:downloadimg_data filename:file_name saveTo:img_url];
+                        
+                        UIImage * img =[UIImage imageWithData:downloadimg_data];
+                        bannercell.BannerImageView.image = img;
+                    }
+                    else
+                    bannercell.BannerImageView.image=[UIImage imageNamed:@"notfound_l"];
+                });
+            });
+            
+            
+        }
+        cell.backgroundColor = [UIColor whiteColor];
+        
+        
+  
+        
+    }
+    else if([type isEqualToString:@"button_banner"])
+    {
+        
+       
+        int cell_width = [[view_json valueForKey:@"width"]intValue];
+        int cell_height = [[view_json valueForKey:@"height"]intValue];
+        float ui_height = (tableView.frame.size.width * cell_height)/(float)cell_width;
+        float ui_width = tableView.frame.size.width ;
+        NSString *CellIdentifier = @"HomeTableViewCellButtonBanner";
+        cell= [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
+        
+        //   HomeTableViewCellButtonBanner * bannercell=(HomeTableViewCellButtonBanner*)cell;
+        for(UIView* v in cell.contentView.subviews)
+        {
+            [v removeFromSuperview];
+        }
+        
+        int count = [[view_json valueForKey:@"count"] intValue];
+        
+        for(int i_item = 0;i_item<count;i_item++)
+        {
+            NSDictionary* item_json = [view_json objectForKey:[NSString stringWithFormat:@"item_%d",i_item]];
+            int x = [[item_json valueForKey:@"x"]intValue];
+            int y = [[item_json valueForKey:@"y"]intValue];
+            
+            int i_width = [[item_json valueForKey:@"width"]intValue];
+            int i_height = [[item_json valueForKey:@"height"]intValue];
+            
+            float f_width = i_width/(cell_width/ui_width);
+            float f_htight = i_height/(cell_height/ui_height);
+            
+            float fx = x/(cell_width/ui_width);
+            float fy = y/(cell_height/ui_height);
+            UIButton* btn_item = [[UIButton alloc] initWithFrame:CGRectMake(fx, fy, f_width, f_htight)];
+            long tag = indexPath.section*1000+ indexPath.row*100+i_item;
+            btn_item.tag = tag;
+            [btn_item addTarget:self action:@selector(ButtonBannerClick:) forControlEvents:UIControlEventTouchUpInside];
+            
+            [cell.contentView addSubview:btn_item];
+            NSString* img_url =[item_json valueForKeyPath:@"img"];
+            NSString* file_name=[img_url lastPathComponent];
+            NSData* img_data=[ImageUtils load_cached_img:file_name loadFrom:img_url size:btn_item.frame.size allow_enlarge:false];
+            if(img_data!=nil)
+            {
+                
+                UIImage * img =[UIImage imageWithData:img_data];
+                [btn_item setBackgroundImage:img forState:UIControlStateNormal];
+            }
+            else
+            {
+                
+                dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+                    
+                    NSData*  downloadimg_data = [NSData dataWithContentsOfURL:[NSURL URLWithString:img_url]];
+                    
+                    dispatch_async(dispatch_get_main_queue(), ^{
+                        
+                        
+                        
+                        if(downloadimg_data!=nil)
+                        {
+                            
+                            [FileCache cache_img:downloadimg_data filename:file_name saveTo:img_url];
+                            
+                            UIImage * img =[UIImage imageWithData:downloadimg_data];
+                            [btn_item setBackgroundImage:img forState:UIControlStateNormal];
+                        }
+                        else
+                        [btn_item setBackgroundImage:[UIImage imageNamed:@"notfound_l"] forState:UIControlStateNormal];
+                        
+                    });
+                });
+                
+                
+            }
+            
+            
+            
+        }
+        cell.backgroundColor = [UIColor whiteColor];
+        
+      
+    }
+    return cell;
+    
+    
+}
+-(void)ButtonBannerClick:(id)sender{
+
+   
+    //这个sender其实就是UIButton,因此通过sender.tag就可以拿到刚才的参数
+    int tag = (int)[sender tag];
+    int section = tag/1000;
+    int row = (tag-section*1000)/100;
+    int idx =(tag-section*1000 - row*100);
+    NSDictionary* view_json = [self.content objectForKey:[NSString stringWithFormat:@"view_%ld",(long)section ]];
+    NSDictionary* item_json = [view_json objectForKey:[NSString stringWithFormat:@"item_%d",idx]];
+    NSString* action = [item_json valueForKeyPath:@"action"];
+//    
+//    [RASingleton sharedInstance].homeClickedItemName = item_json[@"description"];
+//    
+    if([action isEqualToString:@"itemSearch"])
+    {
+//        [RASingleton sharedInstance].homeItemClick = YES;
+        NSString* covertype = [item_json valueForKeyPath:@"covertype"];
+        
+        
+            
+            ItemSearchViewController* isvc =[ [UIStoryboard storyboardWithName:@"itemsearch" bundle:nil] instantiateViewControllerWithIdentifier:@"ItemSearchViewController"];
+            
+            
+            
+            
+            
+    //        isvc.default_filter = nil;
+            isvc.covertype = covertype;
+    //        isvc.saved_covertype = coverttype;
+            
+            
+            
+            isvc.p_available = nil;
+            isvc.p_price = nil;
+            isvc.p_QTY = nil;
+            isvc.p_bestseller = nil;
+
+    //        [ActiveViewController Notify:@"ItemSearchViewController" Message:RA_NOTIFICATION_RELOAD_DATA];
+
+            
+            [[self navigationController] pushViewController:isvc animated:true];
+    //        [ setNavigationBarHidden:YES animated:NO];
+            
+
+    }
+    else if([action isEqualToString:@"category"])
+    {
+        
+        NSString* cid = [item_json valueForKeyPath:@"category_id"];
+        
+        CatalogListViewController* vc= [[UIStoryboard storyboardWithName:@"catalog" bundle:nil] instantiateViewControllerWithIdentifier:@"CatalogListViewController"];
+        vc.categoryid = cid;
+        [self.navigationController pushViewController:vc animated:TRUE];
+    }
+    else if([action isEqualToString:@"webview"])
+    {
+        NSString* url = [item_json valueForKeyPath:@"url"];
+        
+        
+        NSString* title = [item_json valueForKeyPath:@"title"];
+//        UIApplication * app = [UIApplication sharedApplication];
+//        AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+//        MainViewController* main_vc=(MainViewController*)appDelegate.main_vc;
+//
+//
+        
+        WebViewController *ViewController = [[UIStoryboard storyboardWithName:@"wkweb" bundle:nil] instantiateViewControllerWithIdentifier:@"WebViewController"];
+        ViewController.url = url;
+        ViewController.title = title;
+        ViewController.timeout = 10;
+        
+        ViewController.defaultBarbutton=true;
+        
+        [self.navigationController pushViewController:ViewController animated:YES];
+        
+    }
+    
+    
+}
+
+//
+//#pragma mark TreeView Delegate methods
+//- (CGFloat)treeView:(RATreeView *)treeView heightForRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
+//{
+//    return 47;
+//}
+//
+//- (NSInteger)treeView:(RATreeView *)treeView indentationLevelForRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
+//{
+//    return 3 * treeNodeInfo.treeDepthLevel;
+//}
+//
+//- (BOOL)treeView:(RATreeView *)treeView shouldExpandItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
+//{
+//    return YES;
+//}
+//
+//- (BOOL)treeView:(RATreeView *)treeView shouldItemBeExpandedAfterDataReload:(id)item treeDepthLevel:(NSInteger)treeDepthLevel
+//{
+//    if ([item isEqual:self.expanded]) {
+//        return YES;
+//    }
+//    
+//    return NO;
+//}
+//- (void)treeView:(RATreeView *)treeView didSelectRowForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
+//{
+//    
+//    NSDictionary *data = item;
+//    int count = [[data valueForKey:@"count"] intValue];
+//    if(count==0)
+//    {
+//        //        NSString* category = [data valueForKey:@"id"];
+//        
+//        //        if (self.CateMenu_delegate && [self.CateMenu_delegate respondsToSelector:@selector(SelectCategory:)]) {
+//        //            [self.CateMenu_delegate SelectCategory:category];
+//        //        }
+//        //        /* MainViewController* pvc = (MainViewController*)self.rootViewController;
+//        //         [pvc switchToCagegory:category];*/
+//        //        [self dismissViewControllerAnimated:YES
+//        //                                 completion:^{
+//        //                                     //一定要移除手势 否则下次 没有子视图的时候 点击 会崩溃拉
+//        //                                     AppDelegate *app = [[UIApplication sharedApplication] delegate];
+//        //                                     [app.window removeGestureRecognizer:self.tapGesture];
+//        //                                 }];
+//    }
+//    
+//    //    if (item == nil) {
+//    //        NSDictionary * ret =[self.categoryMenu objectForKey:[NSString stringWithFormat:@"category_%d",index] ];
+//    //
+//    //    }
+//    //    else
+//    //        data=[data objectForKey:[NSString stringWithFormat:@"category_%d",index]];
+//    DebugLog(@"menu select %@",data);
+//}
+//
+//- (void)treeView:(RATreeView *)treeView willDisplayCell:(UITableViewCell *)cell forItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
+//{
+//    if (treeNodeInfo.treeDepthLevel == 0) {
+//        cell.backgroundColor = UIColorFromRGB(0xF7F7F7);
+//    } else if (treeNodeInfo.treeDepthLevel == 1) {
+//        cell.backgroundColor = UIColorFromRGB(0xD1EEFC);
+//    } else if (treeNodeInfo.treeDepthLevel == 2) {
+//        cell.backgroundColor = UIColorFromRGB(0xE0F8D8);
+//    }
+//}
+//
+//#pragma mark TreeView Data Source
+//
+//- (UITableViewCell *)treeView:(RATreeView *)treeView cellForItem:(id)item treeNodeInfo:(RATreeNodeInfo *)treeNodeInfo
+//{
+//    //  NSInteger numberOfChildren = [treeNodeInfo.children count];
+//    
+//    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"];
+//    //    if(numberOfChildren>0)
+//    //        cell.detailTextLabel.text = [NSString stringWithFormat:@"Number of children %@", [@(numberOfChildren) stringValue]];
+//    cell.textLabel.text = [((NSDictionary *)item) valueForKey:@"title"];
+//    cell.selectionStyle = UITableViewCellSelectionStyleNone;
+//    
+//    if (treeNodeInfo.treeDepthLevel == 0) {
+//        cell.detailTextLabel.textColor = [UIColor blackColor];
+//    }
+//    
+//    return cell;
+//}
+//
+//- (NSInteger)treeView:(RATreeView *)treeView numberOfChildrenOfItem:(id)item
+//{
+//    if (item == nil) {
+//        
+//        UIApplication * app = [UIApplication sharedApplication];
+//        AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+//        return [[appDelegate.categoryMenu valueForKey:@"count" ] intValue];
+//        //   return [self.data count];
+//    }
+//    
+//    NSDictionary* data = item;
+//    return [[data valueForKey:@"count"] intValue];
+//    //  RADataObject *data = item;
+//    //  return [data.children count];
+//}
+//
+//- (id)treeView:(RATreeView *)treeView child:(NSInteger)index ofItem:(id)item
+//{
+//    NSDictionary *data = item;
+//    
+//    if (item == nil) {
+//        
+//        UIApplication * app = [UIApplication sharedApplication];
+//        AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+//        NSDictionary * ret =[appDelegate.categoryMenu objectForKey:[NSString stringWithFormat:@"category_%ld",(long)index] ];
+//        return  ret;
+//    }
+//    
+//    return[data objectForKey:[NSString stringWithFormat:@"category_%ld",(long)index]];
+//    /*
+//     
+//     RADataObject *data = item;
+//     if (item == nil) {
+//     return [self.data objectAtIndex:index];
+//     }
+//     
+//     return [data.children objectAtIndex:index];
+//     */
+//}
+#pragma mark - Topic cell delegate
+-(void) TopicItemClicked:(NSString*) product_id category:(NSString*) category
+{
+//
+//    DetailViewController* dvc = [[UIStoryboard storyboardWithName:@"ERP_Mobile_Model" bundle:nil] instantiateViewControllerWithIdentifier:@"DetailViewController" ];
+//    //            dvc
+//    
+//    dvc.product_id=product_id;
+//    dvc.category_id=category;
+//    dvc.ispush=true;
+//    [dvc reload];
+//    [self.navigationController pushViewController:dvc animated:true];
+}
+//- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
+//{
+//
+//    MainViewController* pvc = (MainViewController*)self.parentViewController;
+// //   [pvc categoryMenuSelected:indexPath.row];
+//}
+
+- (void)reRefreshView {
+    [self.tableView reloadData];
+}
+#pragma mark - RA_NOTIFICAITON
+-(void) refresh_ui
+{
+    [self.tableView reloadData];
+}
+-(void) reload_data
+{
+    [self LoadData];
+}
+@end

+ 16 - 0
RedAnt iShop/iShop/RootFrame/MyViewController.h

@@ -0,0 +1,16 @@
+//
+//  MyViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "TabViewController.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface MyViewController : TabViewController
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 39 - 0
RedAnt iShop/iShop/RootFrame/MyViewController.m

@@ -0,0 +1,39 @@
+//
+//  MyViewController.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import "MyViewController.h"
+
+@interface MyViewController ()
+
+@end
+
+@implementation MyViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    
+    // Do any additional setup after loading the view.
+}
+
+- (void)viewWillAppear:(BOOL)animated
+{
+    [super viewWillAppear:animated];
+    [[self navigationController] setNavigationBarHidden:NO animated:NO];
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 36 - 0
RedAnt iShop/iShop/RootFrame/SearchViewController.h

@@ -0,0 +1,36 @@
+//
+//  SearchViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 1/24/24.
+//
+
+#import "TabViewController.h"
+#import "CategoryHeaderView.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface SearchViewController : TabViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,UIScrollViewDelegate>
+#pragma mark view
+@property (strong, nonatomic) IBOutlet UICollectionView *collectionview;
+@property (strong, nonatomic) IBOutlet UISearchBar *searchBar;
+@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *mum;
+@property (strong, nonatomic) IBOutlet UILabel *label_net_err;
+@property (strong, nonatomic) IBOutlet CategoryHeaderView *headerView;
+@property (weak, nonatomic) IBOutlet UIButton *btnDisplay;
+
+@property (weak, nonatomic) IBOutlet UIView *maskView;
+
+#pragma mark control
+@property (strong, nonatomic) NSMutableDictionary* category_data;
+@property (strong,nonatomic) NSString* keywords;
+@property long offset;
+@property bool loadall;
+@property bool showalert;
+@property int categoryViewType;
+@property bool loadmore_matchfull;
+@property bool showDetail;
+
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 767 - 0
RedAnt iShop/iShop/RootFrame/SearchViewController.m

@@ -0,0 +1,767 @@
+//
+//  SearchViewController.m
+//  iShop
+//
+//  Created by Rui Zhang on 1/24/24.
+//
+
+#import "SearchViewController.h"
+#import "RAUtils.h"
+#import "RANetwork.h"
+
+#import "CatalogCellSmall.h"
+#import "const.h"
+#import "FileCache.h"
+#import "CatalogModelDetailViewController.h"
+
+#define PAGE_ITEM 30
+
+
+@interface SearchViewController ()
+@property (nonatomic,strong) NSOperationQueue *dataOperationQueue;
+@end
+
+@implementation SearchViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    self.searchBar.backgroundImage = [UIImage new];
+    // Do any additional setup after loading the view.
+}
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+
+- (NSOperationQueue *)dataOperationQueue {
+    if (!_dataOperationQueue) {
+        _dataOperationQueue = [[NSOperationQueue alloc] init];
+        _dataOperationQueue.maxConcurrentOperationCount = 1;
+    }
+    return _dataOperationQueue;
+}
+
+-(void) operation_loadMore
+{
+    if (self.dataOperationQueue.operationCount > 1) {
+        return;
+    }
+    dispatch_async(dispatch_get_main_queue(), ^{
+        
+        if(self.loadall)
+        {
+            if(self.showalert)
+            {
+                self.showalert=false;
+
+                
+                [RAUtils message_box:@"Loading items" message:@"All loaded" completion:nil];
+            }
+            return;
+        }
+        
+        self.mum.hidden = false;
+        [self.mum startAnimating];
+        self.mum.center = self.view.center;
+        
+        self.isrefreshing=true;
+        
+        [RANetwork request_search:self.offset limit:PAGE_ITEM keywords:self.keywords matchfull:self.loadmore_matchfull completionHandler:^(NSMutableDictionary *result) {
+            NSMutableDictionary* category_more=result;
+            
+            [self.mum stopAnimating];
+            self.isrefreshing=false;
+            if (self.dataOperationQueue.operationCount > 1) {
+                return;
+            }
+            
+            NSDictionary* more_items=[category_more objectForKey:@"items"];
+            if([[category_more valueForKey:@"result"] intValue]==2)
+            {
+                //  self.category_data = category_data;
+                NSMutableDictionary* items_json= [[self.category_data objectForKey:@"items"] mutableCopy];
+                
+                int count =[[more_items valueForKey:@"count"] intValue];
+                for(int i=0;i<count;i++)
+                {
+                    
+                    NSDictionary * item_json = [more_items objectForKey:[NSString stringWithFormat:@"item_%d",i]];
+                    [items_json setObject:item_json forKey:[NSString stringWithFormat:@"item_%ld",i+self.offset]];
+                    
+                    
+                }
+                long newcount=[[[self.category_data objectForKey:@"items"] valueForKey:@"count"] intValue]+count;
+                [items_json setValue: [NSString stringWithFormat:@"%ld",newcount] forKey:@"count"];
+                [self.category_data setObject:items_json forKey:@"items"];
+                self.offset+=count;
+                if(count<PAGE_ITEM)
+                {
+                    self.loadall=true;
+                    
+                }
+                //            NSDictionary * item_json = [self.category_data objectForKey:@"items"];
+                
+                
+                
+                
+                //        DebugLog(@"%@",self.category_data);
+                
+                [self.collectionview reloadData];
+                
+            }
+            else
+            {
+                [RAUtils message_box:@"Search" message:[category_more valueForKey:@"err_msg"] completion:nil];
+            }
+            self.isrefreshing=false;
+            
+            
+        }];
+        
+        return;
+        
+        
+    });
+}
+
+-(void) loadMore {
+    __weak typeof(self) weakself = self;
+    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
+        
+        if (weakself) {
+            __strong typeof(weakself) strongself = weakself;
+            [strongself operation_loadMore];
+        }
+        
+    }];
+    
+    [self.dataOperationQueue addOperation:operation];
+}
+
+-(void) operation_reload
+{
+    if (self.dataOperationQueue.operationCount > 1) {
+        return;
+    }
+
+    dispatch_async(dispatch_get_main_queue(), ^{
+        if(self.isrefreshing)
+            return;
+        self.showalert=true;
+        self.isrefreshing=true;
+        self.loadall = false;
+        UIRefreshControl *reF = (UIRefreshControl *)[self.collectionview viewWithTag:200];
+        
+        [reF endRefreshing];
+        
+        reF.attributedTitle = [[NSAttributedString alloc]initWithString:@"Pull to refresh"];
+        self.label_net_err.hidden=true;
+        self.collectionview.hidden=true;
+        self.mum.center = self.view.center;
+        self.mum.hidden = false;
+        [self.mum startAnimating];
+        self.loadmore_matchfull = false;//self.switch_matchfull.isOn;
+        [RANetwork request_search:0 limit:PAGE_ITEM keywords:self.keywords
+                        matchfull:self.loadmore_matchfull completionHandler:^(NSMutableDictionary *result) {
+            NSMutableDictionary* category_data=result;
+            
+            
+            [self.mum stopAnimating];
+            self.isrefreshing=false;
+            if (self.dataOperationQueue.operationCount > 1) {
+                return;
+            }
+            
+            self.category_data = [category_data mutableCopy];
+            [self.collectionview reloadData];
+            
+            if([[category_data valueForKey:@"result"] intValue]==2)
+            {
+                self.collectionview.hidden=false;
+                NSDictionary * item_json = [self.category_data objectForKey:@"items"];
+                self.offset =[[item_json valueForKey:@"count"] intValue];
+                
+                int total = [[self.category_data valueForKey:@"item_total_count"]intValue];
+                
+                
+            }
+            else if([[category_data valueForKey:@"result"] intValue]==RESULT_NET_ERROR)
+            {
+                self.collectionview.hidden=true;
+                self.label_net_err.hidden=false;
+            }
+            else
+            {
+
+                
+                [RAUtils message_box:@"Search" message:[category_data valueForKey:@"err_msg"] completion:nil];
+            }
+            
+            self.isrefreshing=false;
+            
+            
+        }];
+        
+        return;
+        
+        
+    });
+}
+
+-(void) reload {
+    __weak typeof(self) weakself = self;
+    NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
+        
+        if (weakself) {
+            __strong typeof(weakself) strongself = weakself;
+            [strongself operation_reload];
+        }
+        
+    }];
+    
+    [self.dataOperationQueue addOperation:operation];
+}
+
+- (IBAction)onChangeDisplay:(UIButton *)sender {
+    UICollectionViewFlowLayout *flowLayout =(UICollectionViewFlowLayout*)[self.collectionview collectionViewLayout];
+    
+    flowLayout.scrollDirection= UICollectionViewScrollDirectionVertical;
+    
+    
+    if(sender.tag==2&&self.categoryViewType != CATEGORY_VIEWTYPE_SMALL)
+    {
+        self.categoryViewType = CATEGORY_VIEWTYPE_SMALL;
+        //  [self.collectionview.collectionViewLayout invalidateLayout];
+        //        DebugLog(@"frame %f",self.collectionview.frame.size.height);
+        //        DebugLog(@"offset %f",self.self.collectionview.contentOffset.y);
+        //        DebugLog(@"content %f",self.collectionview.contentSize.height);
+        //        float pos =self.collectionview.contentOffset.y/self.collectionview.contentSize.height;
+        [self.collectionview reloadData];
+        
+        
+        
+        [self.btnDisplay setImage:[UIImage imageNamed:@"24_layout_list"] forState:UIControlStateNormal];
+        
+        
+        sender.tag=4;
+        
+        //        CGPoint offset = self.collectionview.contentOffset;
+        //        offset.y=pos*self.collectionview.contentSize.height;
+        //        self.collectionview.contentOffset=offset;
+        
+    }
+  
+    else if(sender.tag==4&&self.categoryViewType != CATEGORY_VIEWTYPE_LIST)
+    {
+        self.categoryViewType = CATEGORY_VIEWTYPE_LIST;
+        
+        //        DebugLog(@"frame %f",self.collectionview.frame.size.height);
+        //        DebugLog(@"offset %f",self.self.collectionview.contentOffset.y);
+        //        DebugLog(@"content %f",self.collectionview.contentSize.height);
+        
+        //        float pos =self.collectionview.contentOffset.y/self.collectionview.contentSize.height;
+        
+        //        [self.collectionview reloadData];
+        //   [self.collectionview.collectionViewLayout invalidateLayout];
+        
+        [self.collectionview reloadData];
+        
+        [self.btnDisplay setImage:[UIImage imageNamed:@"24_layout_grid"] forState:UIControlStateNormal];
+        sender.tag=2;
+        //        CGPoint offset = self.collectionview.contentOffset;
+        //        offset.y=pos*self.collectionview.contentSize.height;
+        //        self.collectionview.contentOffset=offset;
+        //
+        //        self.collectionview move
+    }
+ 
+    
+    
+    [self showCategory];
+    
+    
+  
+    
+    
+    
+    
+    // [self showCategory];
+}
+
+
+-(void) showCategory
+{
+    if(self.showDetail==false)
+        return;
+    //    UIInterfaceOrientation orientation =[UIApplication sharedApplication].statusBarOrientation;
+    //    int width=175;
+    //    // int height;
+    //    if(orientation == UIDeviceOrientationLandscapeLeft ||orientation == UIDeviceOrientationLandscapeRight)
+    //    {
+    //        width = 370;
+    //        //      height = 400;
+    //    }
+    //    else
+    //    {
+    //        //      height = 300;
+    //        width = 175;
+    //    }
+    //
+    
+    CGRect frame = CGRectMake(0, 48, self.view.bounds.size.width
+                              , self.view.bounds.size.height-48);
+    
+    [UIView animateWithDuration:0.5 animations:^{ self.collectionview.frame=frame;
+    }];
+    self.collectionview.autoresizingMask = self.collectionview.autoresizingMask | UIViewAutoresizingFlexibleWidth;
+    
+    self.showDetail = false;
+//    self.cagegoryLabel.hidden = false;
+    
+}
+
+#pragma mark - searchBar delegate;
+- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
+{
+    
+    
+    self.keywords=searchBar.text;
+    self.offset = 0;
+    //  [self.content_data removeAllObjects];
+    [self reload];
+    DebugLog(@"search");
+    
+    [self.view endEditing:true];
+//    [self.searchBar.searchTextField endEditing:true];
+}
+
+- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
+{
+    self.maskView.hidden =false;
+}
+
+- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
+{
+    self.maskView.hidden =true;
+}
+// - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
+// {
+// 
+//     if(searchText.length == 0)
+//        [self.view endEditing:true];
+// 
+// }
+- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
+    [[self view] endEditing:YES];
+}
+
+
+//- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
+//{
+//
+//}
+
+#pragma mark -- UICollectionViewDataSource
+
+-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
+
+{
+    // 每个Section的item个数
+    NSDictionary * item_json = [self.category_data objectForKey:@"items"];
+    int count =[[item_json valueForKey:@"count"] intValue];
+    return count;
+    
+}
+-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
+{
+    return 1;
+}
+-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
+{
+//    NSString* value =[DefaultAppearance get_noneappearance_value:@"CategoryViewController" valuename:@"cell_border_color"];
+//    
+//    if(value==nil)
+//        value=@"";
+//    unsigned long color = strtoul([value UTF8String],0,16);
+    
+    
+    if(self.categoryViewType == CATEGORY_VIEWTYPE_SMALL)
+    {
+        static NSString * CellIdentifier = @"CatalogCellSmall";
+        CatalogCellSmall * cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
+        NSDictionary * item_json =[[self.category_data objectForKey:@"items" ] objectForKey:[NSString stringWithFormat:@"item_%ld",(long)indexPath.row]];
+        
+        NSString* description =[item_json valueForKey:@"description"];
+        
+        NSString* name =[item_json valueForKey:@"fash_name"];
+        
+//        bool wish_exist = [[item_json valueForKey:@"wish_exists"]boolValue];
+//        bool cart_exists = [[item_json valueForKey:@"cart_exists"]boolValue];
+        bool closeout = [[item_json valueForKey:@"is_closeout"]boolValue];
+//        BOOL more_color = [[item_json valueForKey:@"more_color"] boolValue];
+//        cell.mark_moreColor.hidden = !more_color;
+//        if(wish_exist)
+//            cell.mark_wish.hidden=false;
+//        else
+//            cell.mark_wish.hidden=true;
+//        if(cart_exists)
+//            cell.mark_order.hidden=false;
+//        else
+//            cell.mark_order.hidden=true;
+//        if(closeout)
+//            cell.mark_closeout.hidden=false;
+//        else
+//            cell.mark_closeout.hidden=true;
+        //    NSString* old_price =[item_json valueForKey:@"old_price"];
+        //    NSString* price =[item_json valueForKey:@"price"];
+        
+        
+        
+        if(closeout)
+            cell.ic_closeout.hidden=false;
+        else
+            cell.ic_closeout.hidden=true;
+        bool checked =[[item_json valueForKey:@"checked"] boolValue];
+        
+        
+        
+        if(!checked)
+        {
+            
+//            cell.checkImageView.hidden = true;
+            [cell setBackgroundColor:[UIColor whiteColor]/* UIColorFromRGB(0x996633)*/];
+        }
+        else
+        {
+//            cell.checkImageView.hidden = false;
+            [cell setBackgroundColor: UIColorFromRGB(0x009966)];
+        }
+        
+        
+        cell.nameLabel.text = description;
+        cell.modelNoLabel.text=name;
+        
+        
+        
+        //    cell.cellDescription.text = description;
+        //    cell.oldPrice.text = old_price;
+        //    cell.Price.text = price;
+        
+        
+//        cell.layer.borderColor = UIColorFromRGB(color).CGColor;
+        cell.layer.borderWidth = 0.4;
+        cell.layer.cornerRadius=15;
+        cell.layer.masksToBounds=true;
+        
+#ifdef BUILD_UWAVER
+        
+        cell.mark_wish.hidden = YES;
+        cell.mark_order.hidden = YES;
+        cell.mark_closeout.hidden = YES;
+        cell.mark_moreColor.hidden = YES;
+        
+#endif
+        
+        return cell;
+    }
+  
+    else
+    {
+        static NSString * CellIdentifier = @"CatalogCellList";
+        CatalogCellSmall * cell = [collectionView dequeueReusableCellWithReuseIdentifier:CellIdentifier forIndexPath:indexPath];
+        NSDictionary * item_json =[[self.category_data objectForKey:@"items" ] objectForKey:[NSString stringWithFormat:@"item_%ld",(long)indexPath.row]];
+        NSString* description =[item_json valueForKey:@"description"];
+        
+        NSString* name =[item_json valueForKey:@"fash_name"];
+        
+        
+//        bool wish_exist = [[item_json valueForKey:@"wish_exists"]boolValue];
+//        bool cart_exists = [[item_json valueForKey:@"cart_exists"]boolValue];
+        bool closeout = [[item_json valueForKey:@"is_closeout"]boolValue];
+//        BOOL more_color = [[item_json valueForKey:@"more_color"] boolValue];
+     
+        
+        
+        if(closeout)
+            cell.ic_closeout.hidden=false;
+        else
+            cell.ic_closeout.hidden=true;
+        
+        //    NSString* old_price =[item_json valueForKey:@"old_price"];
+        //    NSString* price =[item_json valueForKey:@"price"];
+        
+        
+        
+//        bool checked =[[item_json valueForKey:@"checked"] boolValue];
+        
+        
+        
+    
+        cell.nameLabel.text = description;
+        cell.modelNoLabel.text=name;
+        
+        
+        //    cell.cellDescription.text = description;
+        //    cell.oldPrice.text = old_price;
+        //    cell.Price.text = price;
+        
+//        cell.layer.borderColor = UIColorFromRGB(color).CGColor;
+        cell.layer.borderWidth = 0.2;
+        //cell.layer.cornerRadius=15;
+        cell.layer.masksToBounds=true;
+        
+#ifdef BUILD_UWAVER
+        
+        cell.mark_wish.hidden = YES;
+        cell.mark_order.hidden = YES;
+        cell.mark_closeout.hidden = YES;
+        cell.mark_moreColor.hidden = YES;
+        
+#endif
+        
+        return cell;
+    }
+}
+
+- (void)collectionCell:(CatalogCellSmall *)cell setImageForIndexPath:(NSIndexPath *)indexPath {
+    
+    NSDictionary * item_json =[[self.category_data objectForKey:@"items" ] objectForKey:[NSString stringWithFormat:@"item_%ld",(long)indexPath.row]];
+    NSString* img_url =[item_json valueForKey:@"img"];
+    
+    
+    NSString *loading = @"loading_l";
+    NSString *notFound = @"notfound_l";
+    
+    if (self.categoryViewType == CATEGORY_VIEWTYPE_LARGE) {
+        
+        loading = @"loading_l";
+        notFound = @"notfound_l";
+        img_url =[item_json valueForKey:@"img_big"]; // large 大图
+        
+    } else if (self.categoryViewType == CATEGORY_VIEWTYPE_SMALL) {
+        
+        loading = @"loading_s";
+        notFound = @"notfound_s";
+        img_url =[item_json valueForKey:@"img"]; // large 大图
+        
+    }
+    NSString* file_name=[img_url lastPathComponent];
+    if (![cell.imageName isEqualToString:img_url]) {
+        cell.imageName = img_url;
+        cell.cellImageView.image = [UIImage imageNamed:loading];
+        NSData* img_data=[FileCache load_cached_img:file_name loadFrom:img_url];
+        if(img_data!=nil)
+        {
+            
+            UIImage * img =[UIImage imageWithData:img_data];
+            cell.cellImageView.image = img;
+        }
+        else
+        {
+            DebugLog(@"load image");
+            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+                
+                NSData*  downloadimg_data = [NSData dataWithContentsOfURL:[NSURL URLWithString:img_url]];
+                
+                dispatch_async(dispatch_get_main_queue(), ^{
+                    
+                    
+                    
+                    if(downloadimg_data!=nil)
+                    {
+                        
+                        [FileCache cache_img:downloadimg_data filename:file_name saveTo:img_url];
+                        
+                        UIImage * img =[UIImage imageWithData:downloadimg_data];
+                        cell.cellImageView.image = img;
+                    }
+                    else
+                        cell.cellImageView.image = [UIImage imageNamed:notFound];
+                    
+                });
+            });
+            
+            
+        }
+    }
+    
+}
+
+- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
+    
+    CatalogCellSmall * son_cell = (CatalogCellSmall *)cell;
+    son_cell.imageName = nil;
+    [self collectionCell:son_cell setImageForIndexPath:indexPath];
+}
+
+- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {
+    
+    CatalogCellSmall * son_cell = (CatalogCellSmall *)cell;
+    
+    NSString *loading = @"loading_l";
+    
+    if (self.categoryViewType == CATEGORY_VIEWTYPE_LARGE) {
+        
+        loading = @"loading_l";
+        
+    } else if (self.categoryViewType == CATEGORY_VIEWTYPE_SMALL) {
+        
+        loading = @"loading_s";
+        
+    }
+    
+    son_cell.cellImageView.image = [UIImage imageNamed:loading];
+}
+
+
+
+#pragma mark --UICollectionViewDelegateFlowLayout
+
+
+
+////定义每个UICollectionView 的大小
+//- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
+//{
+//    return CGSizeMake(96, 100);
+//}
+//定义每个UICollectionView 的 margin
+
+- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    
+    if(self.categoryViewType ==CATEGORY_VIEWTYPE_LIST)
+        return CGSizeMake(self.view.frame.size.width, 80);
+    return CGSizeMake((self.view.frame.size.width-30)/2, 251);
+
+    
+
+
+
+    
+}
+- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
+{
+    if(self.categoryViewType ==CATEGORY_VIEWTYPE_LIST)
+        return 0;
+    return 10;
+}
+-(UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
+{
+    if(self.showDetail)
+        return UIEdgeInsetsMake(10, 5, 10, 5);
+
+
+    if(self.categoryViewType ==CATEGORY_VIEWTYPE_LARGE)
+        return UIEdgeInsetsMake(10, 10, 10, 10);
+    else if(self.categoryViewType ==CATEGORY_VIEWTYPE_LIST)
+        return UIEdgeInsetsMake(10, 0, 10, 0);
+    return UIEdgeInsetsMake(10, 10, 10, 10);
+
+
+    
+    
+    return UIEdgeInsetsMake(10, 10, 10, 10);
+}
+#pragma mark --UICollectionViewDelegate
+
+-(void) showDetailat:(NSString*) item_id category_id:(NSString*) category_id name:(NSString *)name index:(long)index
+{
+    
+    
+    CatalogModelDetailViewController* dvc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"CatalogModelDetailViewController" ];
+
+    
+    dvc.OnBack=^(bool add_cart,bool add_wish,bool update_data)
+    {
+        
+        
+        NSMutableDictionary* items =[[self.category_data objectForKey:@"items"] mutableCopy];
+        
+        NSMutableDictionary* item = [[items objectForKey:[NSString stringWithFormat:@"item_%ld",index]] mutableCopy];
+        if(add_cart)
+            item[@"cart_exists"]=@"true";
+        if(add_wish)
+            item[@"wish_exists"]=@"true";
+        items[[NSString stringWithFormat:@"item_%ld",index]] = item;
+        self.category_data[@"items"]=items;
+
+        [self.collectionview reloadData];
+    };
+
+    dvc.product_id = item_id;
+    dvc.category_id=category_id;
+    dvc.ispush = true;
+    dvc.model_name = name;
+    
+    [dvc reload];
+    [self.navigationController pushViewController:dvc animated:true];
+    return;
+  
+    
+    
+}
+
+//UICollectionView被选中时调用的方法
+-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
+{
+    NSMutableDictionary* items =[[self.category_data objectForKey:@"items"] mutableCopy];
+    
+    NSMutableDictionary* item = [[items objectForKey:[NSString stringWithFormat:@"item_%ld",(long)indexPath.row]] mutableCopy];
+    
+//    if(self.isSelectionMode)
+//    {
+//        bool checked =[[item valueForKey:@"checked"] boolValue];
+//        
+//        CategoryCellNPD *currentSelecteCell = (CategoryCellNPD *)[self.collectionview cellForItemAtIndexPath:indexPath];
+//        
+//        
+//        if(checked)
+//        {
+//            self.select_count--;
+//            if(self.select_count==0)
+//            {
+//                //                self.addWishBtn.enabled = false;
+//                //                self.addCartBtn.enabled = false;
+//                //                self.addPortfolioBtn.enabled=false;
+//            }
+//            [item setValue:@"false" forKey:@"checked"];
+//            
+//            currentSelecteCell.checkImageView.hidden = true;
+//            if(self.categoryViewType != CATEGORY_VIEWTYPE_LIST)
+//                [currentSelecteCell setBackgroundColor: [UIColor whiteColor]];
+//            else
+//                [currentSelecteCell setBackgroundColor:  [UIColor whiteColor]];
+//        }
+//        else
+//        {
+//            self.select_count++;
+//            //            self.addWishBtn.enabled = true;
+//            //            self.addCartBtn.enabled = true;
+//            //            self.addPortfolioBtn.enabled=true;
+//            [item setValue:@"true" forKey:@"checked"];
+//            currentSelecteCell.checkImageView.hidden = false;
+//            [currentSelecteCell setBackgroundColor: UIColorFromRGB(0x009966)];
+//        }
+//        [items setObject:item forKey:[NSString stringWithFormat:@"item_%ld",(long)indexPath.row]];
+//        [self.category_data setObject:items forKey:@"items"];
+//        
+//        
+//    }
+//    else
+    {
+        NSString* detail_id = [NSString stringWithFormat:@"%@",[item valueForKey:@"product_id"]];
+        
+        [self showDetailat:detail_id category_id:nil name:[item objectForKey:@"fash_name"] index:indexPath.row];
+    }
+    
+}
+
+@end

+ 45 - 0
RedAnt iShop/iShop/RootFrame/TabViewController.h

@@ -0,0 +1,45 @@
+//
+//  TabViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "NotificationNameCenter.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface TabViewController : UIViewController
+
+
+
+-(void) logout;
+-(void) refresh_on_login;
+
+
+@property int refresh_type;
+
+@property bool isrefreshing;
+
+-(void)refresh_btn_click:(UILongPressGestureRecognizer*)gestureRecognizer;
+//-(void) showHidePrice;
+@property bool disable_refresh;
+
+- (void)reRefreshView;
+
+@property NotificationRefreshLevel notification_refreshLevel;
+@property bool show_navi;
+
+
+#pragma mark - child class response notification
+-(void) refresh_ui;
+-(void) reload_data;
+-(void) clear_data;
+-(void) refresh_price;
+
++(void) Notify:(NSString*) arr_receiver Message:(NSString*)notification_msg ;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 406 - 0
RedAnt iShop/iShop/RootFrame/TabViewController.m

@@ -0,0 +1,406 @@
+//
+//  TabViewController.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/14/23.
+//
+
+#import "TabViewController.h"
+
+#import "const.h"
+
+#import "RAConvertor.h"
+
+@interface TabViewController ()
+
+@end
+
+@implementation TabViewController
+
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(OnRefreshUI:) name:RA_NOTIFICATION_REFRESH_UI object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(OnReloadData:) name:RA_NOTIFICATION_RELOAD_DATA object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(OnClearData:) name:RA_NOTIFICATION_CLEAR_DATA object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(OnUpdatePrice:) name:RA_NOTIFICATION_UPDATE_PRICE object:nil];
+    
+    self.notification_refreshLevel = NotificationRefreshLevelData;
+    // Do any additional setup after loading the view.
+}
+
+- (void)viewWillAppear:(BOOL)animated
+{
+    [super viewWillAppear:animated];
+    
+    
+//    
+    if(self.show_navi)
+    {
+        [[self navigationController] setNavigationBarHidden:FALSE animated:NO];
+    }
+    else
+    {
+        [[self navigationController] setNavigationBarHidden:YES animated:NO];
+    }
+//    self.navigationController.navigationBarHidden=true;
+    
+    
+    switch (self.notification_refreshLevel)
+    {
+        case NotificationRefreshLevelView:
+            if([self respondsToSelector:@selector(refresh_ui)])
+            {
+                [self refresh_ui];
+                self.notification_refreshLevel = NotificationRefreshLevelNone;
+            
+            }
+            break;
+        case NotificationRefreshLevelData:
+            if([self respondsToSelector:@selector(reload_data)])
+            {
+                [self reload_data];
+                self.notification_refreshLevel = NotificationRefreshLevelNone;
+            }
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+//
+//-(void)routerEvent:(NSString*)event Info:(id)info
+//{
+//    return;
+//    
+////    if([event isEqualToString:@"RA_NOTIFICATION_RELEASE_SCANNER"])
+////    {
+////        if(self.support_scanner)
+////        {
+////            int a=0;
+////#ifdef RA_NOTIFICATION
+////            UIApplication * app = [UIApplication sharedApplication];
+////            AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+////
+////            if(self.support_scanner)
+////            {
+////                appDelegate.eventsFeedback = self;
+////            }
+////#endif
+////        }
+////        else
+////            [super routerEvent:event Info:info];
+////    }
+////    else
+////        [super routerEvent:event Info:info];
+//
+//}
+
+
+
+- (void)dealloc
+{
+
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+}
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+-(void)viewDidAppear:(BOOL)animated
+{
+    [super viewDidAppear:animated];
+
+}
+-(void)viewDidDisappear:(BOOL)animated
+{
+    [super viewDidDisappear:animated];
+}
+
+//-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
+//{
+////    UIApplication * app = [UIApplication sharedApplication];
+////    AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+////    [appDelegate didRotated];
+//
+////    UIInterfaceOrientation orientation = [[UIApplication sharedApplication]statusBarOrientation];
+////    if (UIInterfaceOrientationIsLandscape(orientation)|| UIInterfaceOrientationIsPortrait(orientation))
+////    {
+////        self.orientation = orientation;
+////        [self.collectionview.collectionViewLayout invalidateLayout];
+////        DebugLog(@"routed");
+////    }
+//
+//
+//
+//
+//}
+
+- (void)reRefreshView {
+    
+}
+
+-(void) logout
+{
+    self.refresh_type=REFRESH_NONE;
+}
+
+-(void) refresh_on_login
+{
+
+}
+-(void)refresh_btn_click:(UILongPressGestureRecognizer*)gestureRecognizer
+{
+    if([self respondsToSelector:@selector(reload_data)])
+       [self reload_data];
+//    [self reload_container_getdata:true];
+    
+}
+
+/*
+ #pragma mark - Navigation
+ 
+ // In a storyboard-based application, you will often want to do a little preparation before navigation
+ - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+ // Get the new view controller using [segue destinationViewController].
+ // Pass the selected object to the new view controller.
+ }
+ */
+#pragma mark - Support scanner
+-(void) OnUpdateDevicesList
+{
+    
+}
+-(void) onDecodedData:(NSString*) value
+{
+    
+}
+-(void) onErrorInfo:(NSString*) errorInfo
+{
+    
+}
+-(void) onStatusChanged:(NSString*) status
+{
+    
+}
+-(void) onLogUpdate
+{
+    
+}
+
+#pragma mark - Notification
+//-(void)OnReleaseScanner:(NSNotification *)notification
+//{
+//    if(!self.support_scanner)
+//        return;
+//    else
+//        {
+//                    int a=0;
+//
+//                    UIApplication * app = [UIApplication sharedApplication];
+//                    AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+//
+//                    if(self.support_scanner)
+//                    {
+//                        appDelegate.eventsFeedback = self;
+//                    }
+//
+//            }
+//    NSLog(@"release scanner !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+//}
+- (void)OnUpdatePrice: (NSNotification *)notification
+{
+                    if(self.disable_refresh)
+                        return;
+                    
+                    NSDictionary* dict = [notification userInfo];
+                    NSArray* arr= dict[@"receiver"];
+                    
+                    //如果当前对象不在不是指定接收者,也不是广播通信,就返回。
+                    if([arr indexOfObject:[self class_name]]==NSNotFound&& arr.count>0)
+                        return;
+                    
+                    //如果当前对象本身不支持此动作,则返回
+                    if(![self respondsToSelector:@selector(refresh_price)])
+                        return;
+                    
+                    //如果当前已有的处理层级更高(reload),则不处理,交给reload 处理。
+                    if(self.notification_refreshLevel<NotificationRefreshLevelView)
+                    {
+                        if([self isVisible])
+                        {
+                            [self refresh_price];
+                            self.notification_refreshLevel = NotificationRefreshLevelNone;
+                        }
+                        else
+                        {
+                            self.notification_refreshLevel = NotificationRefreshLevelView;
+                        }
+                    }
+
+    
+
+}
+
+- (void)OnRefreshUI: (NSNotification *)notification
+{
+                if(self.disable_refresh)
+                    return;
+                
+                NSDictionary* dict = [notification userInfo];
+                NSArray* arr= dict[@"receiver"];
+                if([arr indexOfObject:[self class_name]]==NSNotFound&& arr.count>0)
+                    return;
+                
+                if(![self respondsToSelector:@selector(refresh_ui)])
+                    return;
+                
+                if(self.notification_refreshLevel<NotificationRefreshLevelView)
+                {
+                    if([self isVisible])
+                    {
+                        
+                        [self refresh_ui];
+                        self.notification_refreshLevel = NotificationRefreshLevelNone;
+                    }
+                    else
+                    {
+                        
+                        self.notification_refreshLevel = NotificationRefreshLevelView;
+                    }
+                }
+
+}
+- (void)OnReloadData: (NSNotification *)notification
+{
+             if(self.disable_refresh)
+                return;
+            
+            NSDictionary* dict = [notification userInfo];
+            NSArray* arr= dict[@"receiver"];
+            if([arr indexOfObject:[self class_name]]==NSNotFound&& arr.count>0)
+                return;
+            if(![self respondsToSelector:@selector(reload_data)])
+                return;
+            if(self.notification_refreshLevel<NotificationRefreshLevelData)
+            {
+                if([self isVisible])
+                {
+                    
+                    [self reload_data];
+                    self.notification_refreshLevel = NotificationRefreshLevelNone;
+                }
+                else
+                {
+                    
+                    self.notification_refreshLevel = NotificationRefreshLevelData;
+                }
+            }
+   
+    
+}
+- (void)OnClearData: (NSNotification *)notification
+{
+    NSDictionary* dict = [notification userInfo];
+    NSArray* arr= dict[@"receiver"];
+    if([arr indexOfObject:[self class_name]]==NSNotFound&& arr.count>0)
+        return;
+
+        if(![self respondsToSelector:@selector(clear_data)])
+        return;
+        if([self isVisible])
+        {
+            
+            if([self respondsToSelector:@selector(clear_data)])
+            {
+                [self clear_data];
+                if([self respondsToSelector:@selector(refresh_ui)])
+                {
+                    [self refresh_ui];
+                    self.notification_refreshLevel = NotificationRefreshLevelNone;
+                }
+            }
+        }
+        else
+        {
+            if([self respondsToSelector:@selector(clear_data)])
+            {
+                [self clear_data];
+                self.notification_refreshLevel = NotificationRefreshLevelView;
+            }
+        }
+    
+
+
+    
+}
+#pragma mark - utils
+-(BOOL)isVisible
+{
+    return (self.isViewLoaded && self.view.window);
+}
+- (NSString *)class_name {
+
+        const char *class_name_ch = object_getClassName([self class]);
+
+
+    return [NSString stringWithUTF8String:class_name_ch];
+}
++(void) Notify:(NSString*) receiver Message:(NSString*)notification_msg
+{
+        dispatch_async(dispatch_get_main_queue(), ^{
+//NSArray* arr1 =[RAConvertor string2arr:@"abcde" separator:nil];
+//    NSArray* arr2 =[RAConvertor string2arr:nil separator:nil];
+    NSArray* arr_receiver = [RAConvertor string2arr:receiver separator:@","];
+    NSMutableDictionary* dict = [NSMutableDictionary new];
+    dict[@"receiver"]=arr_receiver;
+    NSString* notificationname = nil;
+    notificationname = notification_msg;
+
+
+    NSNotification *notification =[NSNotification notificationWithName:notificationname object:nil userInfo:dict];
+    
+    //通过通知中心发送通知
+    
+    [[NSNotificationCenter defaultCenter] postNotification:notification];
+    return;
+    
+});
+}
+
+
+-(void) refresh_ui
+{
+    NSAssert(true, @"subclass %@ refresh_ui does not impl.", [self class_name]);
+}
+-(void) reload_data
+{
+    NSAssert(true, @"subclass %@ reload_data does not impl.", [self class_name]);
+}
+-(void) clear_data
+{
+    NSAssert(true, @"subclass %@ clear_data does not impl.", [self class_name]);
+}
+-(void) refresh_price
+{
+    NSAssert(true, @"subclass %@ refresh_price does not impl.", [self class_name]);
+}
+
+
+
+
+/*
+#pragma mark - Navigation
+
+// In a storyboard-based application, you will often want to do a little preparation before navigation
+- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+    // Get the new view controller using [segue destinationViewController].
+    // Pass the selected object to the new view controller.
+}
+*/
+
+@end

+ 23 - 0
RedAnt iShop/iShop/RootFrame/catalog/CatalogCellSmall.h

@@ -0,0 +1,23 @@
+//
+//  CatalogCellSmall.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/29/23.
+//
+
+#import <UIKit/UIKit.h>
+#import "StrikethroughLabel.h"
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CatalogCellSmall : UICollectionViewCell
+@property (strong, nonatomic) IBOutlet UIImageView *cellImageView;
+//@property (strong, nonatomic) IBOutlet UILabel *cellDescription;
+
+@property (strong, nonatomic) IBOutlet UILabel *nameLabel;
+@property (strong, nonatomic) IBOutlet UILabel *modelNoLabel;
+@property (weak, nonatomic) IBOutlet UIImageView *ic_closeout;
+
+@property (nonatomic,copy) NSString *imageName;///<识别图片是否更改
+@end
+
+NS_ASSUME_NONNULL_END

+ 12 - 0
RedAnt iShop/iShop/RootFrame/catalog/CatalogCellSmall.m

@@ -0,0 +1,12 @@
+//
+//  CatalogCellSmall.m
+//  iShop
+//
+//  Created by Rui Zhang on 12/29/23.
+//
+
+#import "CatalogCellSmall.h"
+
+@implementation CatalogCellSmall
+
+@end

+ 58 - 0
RedAnt iShop/iShop/RootFrame/catalog/CatalogFilterViewController.h

@@ -0,0 +1,58 @@
+//
+//  CatalogFilterViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 1/2/24.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CatalogFilterViewController : UIViewController
+@property (strong, nonatomic) NSDictionary* alert_cadedate;
+@property (strong, nonatomic) NSDictionary* qty_cadedate;
+@property (strong, nonatomic) NSDictionary* availability_cadedate;
+@property (strong, nonatomic) NSDictionary* price_cadedate;
+@property (strong, nonatomic) NSDictionary* bestseller_cadedate;
+
+@property (strong,nonatomic) NSString*  categoryid;
+
+
+
+@property (strong, nonatomic) IBOutlet UIButton *buttonQTY;
+@property (strong, nonatomic) IBOutlet UIButton *buttonAlert;
+@property (strong, nonatomic) IBOutlet UIButton *buttonAvailability;
+@property (strong, nonatomic) IBOutlet UIButton *buttonPrice;
+@property (strong, nonatomic) IBOutlet UIButton *buttonBestSeller;
+
+
+@property (strong, nonatomic) IBOutlet UILabel *labelPrice;
+@property (nonatomic , copy) void (^OkClick)(NSString *ids,NSString* modelname,NSString* modeldescrip,NSString* available,NSString* QTY,NSString* alert,NSString* price , NSString* bestseller);
+@property (nonatomic , copy) void (^ResetClick)(void);
+
+
+@property (strong, nonatomic) NSString* modelname;
+@property (strong, nonatomic) NSString* modeldescrip;
+@property (strong, nonatomic) IBOutlet UITextField *textModelName;
+@property (strong, nonatomic) IBOutlet UITextField *textModelDescription;
+
+
+@property (strong, nonatomic) NSMutableDictionary* default_filter;
+
+
+@property (strong,nonatomic)NSDictionary* categoryMenu;
+
+#pragma mark - mutiple selection
+
+@property (nonatomic,copy) NSString *ids;
+//@property (weak, nonatomic) IBOutlet UITextField *availability_min;
+//@property (weak, nonatomic) IBOutlet UITextField *availability_max;
+//@property (weak, nonatomic) IBOutlet UITextField *price_min;
+//@property (weak, nonatomic) IBOutlet UITextField *price_max;
+@property (weak, nonatomic) IBOutlet UILabel *price_dash;
+@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 1007 - 0
RedAnt iShop/iShop/RootFrame/catalog/CatalogFilterViewController.m

@@ -0,0 +1,1007 @@
+//
+//  CatalogFilterViewController.m
+//  iShop
+//
+//  Created by Rui Zhang on 1/2/24.
+//
+
+#import "CatalogFilterViewController.h"
+
+#import "EnumSelectViewController.h"
+
+#import "RAUtils.h"
+#import "RAConvertor.h"
+
+#define INTNUMBERS @"0123456789\n"
+#define NUMBERS @"0123456789.\n"
+
+
+@interface CatalogFilterViewController ()
+
+@end
+
+@implementation CatalogFilterViewController
+
+
+-(void) initUI{
+    self.textModelName.text = self.modelname;
+    
+    self.textModelDescription.text = self.modeldescrip;
+    
+//    self.price_min.delegate = self;
+//    self.price_max.delegate = self;
+//    self.availability_min.delegate=self;
+//    self.availability_max.delegate=self;
+    
+//    UIApplication * app = [UIApplication sharedApplication];
+//    AppDelegate *appDelegate = (AppDelegate *)[app delegate];
+//    if(appDelegate.bLogin)
+//    {
+//        self.labelPrice.hidden=false;
+//        self.buttonPrice.hidden=false;
+//        self.price_max.hidden = false;
+//        self.price_min.hidden = false;
+//        self.price_dash.hidden = false;
+//    }
+//    else
+    {
+//        self.labelPrice.hidden=true;
+//        self.buttonPrice.hidden=true;
+//        self.price_max.hidden = true;
+//        self.price_min.hidden = true;
+//        self.price_dash.hidden = true;
+    }
+    
+    
+    UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"close"] imageWithRenderingMode:UIImageRenderingModeAutomatic]
+                                                                    style:UIBarButtonItemStylePlain
+                                                                   target:self
+                                                                   action:@selector( onCloseClick:)];
+    
+    
+    self.navigationItem.rightBarButtonItem = closeButton;
+    
+    
+//    self.edgesForExtendedLayout = UIRectEdgeNone;
+    
+    
+    {
+        
+        NSString* qty =@"";
+        int count = [[self.qty_cadedate valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[self.qty_cadedate objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                qty = [qty stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        if(qty.length>0)
+            [self.buttonQTY setTitle:qty forState:UIControlStateNormal];
+        
+    }
+    
+    
+    {
+        #if !defined(BUILD_HOMER) && !defined(BUILD_GATIT)
+        NSString* price =@"";
+        int count = [[self.price_cadedate valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[self.price_cadedate objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                price = [price stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        if(price.length>0)
+        {
+
+            [self.buttonPrice setTitle:price forState:UIControlStateNormal];
+
+
+
+        }
+        #else
+        
+        self.price_max.text = self.sprice_max;
+        self.price_min.text = self.sprice_min;
+        self.availability_max.text = self.savail_max;
+        self.availability_min.text = self.savail_min;
+        
+#endif
+    }
+    
+    {
+        
+        NSString* availiablity =@"";
+        int count = [[self.availability_cadedate valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[self.availability_cadedate objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                availiablity = [availiablity stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        if(availiablity.length>0)
+            [self.buttonAvailability setTitle:availiablity forState:UIControlStateNormal];
+        
+    }
+    
+    {
+        NSString* alert =@"";
+        int count = [[self.alert_cadedate valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[self.alert_cadedate objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                alert = [alert stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        if(alert.length>0)
+            [self.buttonAlert setTitle:alert forState:UIControlStateNormal];
+    }
+    
+    
+    {
+        NSString* bestseller =@"";
+        int count = [[self.bestseller_cadedate valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[self.bestseller_cadedate objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                bestseller = [bestseller stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        if(bestseller.length>0)
+            [self.buttonBestSeller setTitle:bestseller forState:UIControlStateNormal];
+    }
+}
+- (void)viewDidLoad {
+    [super viewDidLoad];
+    
+
+    
+    [self initCheckedCategory];
+ 
+    [self initUI];
+
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
+    
+    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidChangeFrame:) name:UIKeyboardDidChangeFrameNotification object:nil];
+    // Do any additional setup after loading the view.
+}
+-(void) dealloc
+{
+    [[NSNotificationCenter defaultCenter] removeObserver:self];
+    //    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
+    //    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
+}
+- (void)didReceiveMemoryWarning {
+    [super didReceiveMemoryWarning];
+    // Dispose of any resources that can be recreated.
+}
+
+/*
+ #pragma mark - Navigation
+ 
+ // In a storyboard-based application, you will often want to do a little preparation before navigation
+ - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
+ // Get the new view controller using [segue destinationViewController].
+ // Pass the selected object to the new view controller.
+ }
+ */
+-(NSMutableDictionary*) resetFilter:(NSMutableDictionary*)filter
+{
+    NSString* str= [RAConvertor dict2string:filter];
+    str=[str stringByReplacingOccurrencesOfString:@"\"check\":1" withString:@"\"check\":0"];
+    str=[str stringByReplacingOccurrencesOfString:@"\"check\":\"1\"" withString:@"\"check\":\"0\""];
+    filter=[[RAConvertor string2dict:str]mutableCopy];
+    filter[@"model_name"]=@"";
+    filter[@"model_description"]=@"";
+    filter[@"price"][@"val_0"][@"check"]=@"1";
+    filter[@"alert"][@"val_0"][@"check"]=@"1";
+    filter[@"qty"][@"val_0"][@"check"]=@"1";
+    filter[@"availability"][@"val_0"][@"check"]=@"1";
+    filter[@"best_seller"][@"val_1"][@"check"]=@"1";
+    return filter;
+}
+- (IBAction)onResetClick:(id)sender {
+    
+    self.default_filter= [self resetFilter:self.default_filter];
+    
+    
+    //  self.default_filter = [self.default_filter mutableCopy];
+    
+ //   self.categoryMenu = [self.default_filter objectForKey:@"category"];
+    self.alert_cadedate =[self.default_filter objectForKey:@"alert"];
+    self.modelname=[self.default_filter valueForKey:@"model_name"];
+    self.modeldescrip=[self.default_filter valueForKey:@"model_description"];
+    
+    
+    self.qty_cadedate=[self.default_filter objectForKey:@"qty"];
+    self.availability_cadedate=[self.default_filter objectForKey:@"availability"];
+    self.price_cadedate=[self.default_filter objectForKey:@"price"];
+    self.bestseller_cadedate=[self.default_filter objectForKey:@"best_seller"];
+    
+#if defined(BUILD_HOMER) || defined(BUILD_GATIT)
+    self.sprice_min=@"";
+    self.sprice_max=@"";
+    self.savail_min=@"";
+    self.savail_max=@"";
+
+#endif
+    [self initUI];
+}
+- (IBAction)onCloseClick:(id)sender {
+    [self dismissViewControllerAnimated:true completion:nil];
+}
+- (IBAction)onAvailabilityClick:(id)sender {
+    
+    
+    EnumSelectViewController* enumvc =[ [UIStoryboard storyboardWithName:@"CommonEditor" bundle:nil] instantiateViewControllerWithIdentifier:@"EnumSelectorViewController"];
+    
+  //  enumvc.delegate = self;
+    enumvc.max_select = 1;
+    enumvc.sys_style = true;
+    //enumvc.updatePosition = indexPath;
+    //        if([[required lowercaseString] isEqualToString:@"true"])
+    //        enumvc.canbeEmpty = false;
+    //        else
+    //        enumvc.canbeEmpty =true;
+    enumvc.cadedate = [self.availability_cadedate mutableCopy];
+    enumvc.title = @"";
+    //       enumvc.value = [value_json mutableCopy];
+    enumvc.single_select =true;
+    
+    enumvc.hide_navibar = false;
+    enumvc.title = @"Available";
+    enumvc.returnValue = ^(NSMutableDictionary* value){
+        self.availability_cadedate = value;
+        
+        
+        NSString* available =@"";
+        int count = [[value valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[value objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                available = [available stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        
+        [self.buttonAvailability setTitle:available forState:UIControlStateNormal];
+    };
+    
+    [self.navigationController pushViewController:enumvc animated:true];
+}
+
+- (IBAction)onBestSellerClick:(id)sender {
+    EnumSelectViewController* enumvc =[[UIStoryboard storyboardWithName:@"CommonEditor" bundle:nil] instantiateViewControllerWithIdentifier:@"EnumSelectorViewController"];
+    
+    //   enumvc.delegate = self;
+    enumvc.max_select = 1;
+    enumvc.sys_style = true;
+    enumvc.hide_navibar = false;
+    enumvc.title = @"BestSeller";
+    //enumvc.updatePosition = indexPath;
+    //        if([[required lowercaseString] isEqualToString:@"true"])
+    //        enumvc.canbeEmpty = false;
+    //        else
+    //        enumvc.canbeEmpty =true;
+    enumvc.cadedate = [self.bestseller_cadedate mutableCopy];
+    enumvc.title = @"";
+    //       enumvc.value = [value_json mutableCopy];
+    enumvc.single_select =true;
+    
+    
+    enumvc.returnValue = ^(NSMutableDictionary* value){
+        self.bestseller_cadedate = value;
+        
+        
+        NSString* qty =@"";
+        int count = [[value valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[value objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                qty = [qty stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        
+        [self.buttonBestSeller setTitle:qty forState:UIControlStateNormal];
+    };
+    
+    [self.navigationController pushViewController:enumvc animated:true];
+}
+
+- (IBAction)onQTYClick:(id)sender {
+    EnumSelectViewController* enumvc =[[UIStoryboard storyboardWithName:@"CommonEditor" bundle:nil] instantiateViewControllerWithIdentifier:@"EnumSelectorViewController"];
+    
+ //   enumvc.delegate = self;
+    enumvc.max_select = 1;
+    enumvc.sys_style = true;
+    enumvc.hide_navibar = false;
+    enumvc.title = @"QTY";
+    //enumvc.updatePosition = indexPath;
+    //        if([[required lowercaseString] isEqualToString:@"true"])
+    //        enumvc.canbeEmpty = false;
+    //        else
+    //        enumvc.canbeEmpty =true;
+    enumvc.cadedate = [self.qty_cadedate mutableCopy];
+    enumvc.title = @"";
+    //       enumvc.value = [value_json mutableCopy];
+    enumvc.single_select =true;
+    
+    
+    enumvc.returnValue = ^(NSMutableDictionary* value){
+        self.qty_cadedate = value;
+        
+        
+        NSString* qty =@"";
+        int count = [[value valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[value objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                qty = [qty stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        
+        [self.buttonQTY setTitle:qty forState:UIControlStateNormal];
+    };
+    
+    [self.navigationController pushViewController:enumvc animated:true];
+}
+- (IBAction)onPriceClick:(id)sender {
+    EnumSelectViewController* enumvc =[[UIStoryboard storyboardWithName:@"CommonEditor" bundle:nil] instantiateViewControllerWithIdentifier:@"EnumSelectorViewController"];
+    
+    //   enumvc.delegate = self;
+    enumvc.max_select = 1;
+    enumvc.sys_style = true;
+    enumvc.hide_navibar = false;
+    enumvc.title = @"Price";
+    //enumvc.updatePosition = indexPath;
+    //        if([[required lowercaseString] isEqualToString:@"true"])
+    //        enumvc.canbeEmpty = false;
+    //        else
+    //        enumvc.canbeEmpty =true;
+    enumvc.cadedate = [self.price_cadedate mutableCopy];
+    enumvc.title = @"";
+    //       enumvc.value = [value_json mutableCopy];
+    enumvc.single_select =true;
+    
+    
+    enumvc.returnValue = ^(NSMutableDictionary* value){
+        self.price_cadedate = value;
+        
+        
+        NSString* price =@"";
+        int count = [[value valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[value objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                price = [price stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        
+        [self.buttonPrice setTitle:price forState:UIControlStateNormal];
+    };
+    
+    [self.navigationController pushViewController:enumvc animated:true];
+}
+- (IBAction)onAlertClick:(id)sender {
+    
+    
+    
+    
+    
+    
+    
+    EnumSelectViewController* enumvc =[[UIStoryboard storyboardWithName:@"CommonEditor" bundle:nil] instantiateViewControllerWithIdentifier:@"EnumSelectorViewController"];
+    
+ //   enumvc.delegate = self;
+    enumvc.max_select = 1;
+    
+    enumvc.sys_style = true;
+    enumvc.hide_navibar = false;
+    enumvc.title = @"Alert";
+    //enumvc.updatePosition = indexPath;
+    //        if([[required lowercaseString] isEqualToString:@"true"])
+    //        enumvc.canbeEmpty = false;
+    //        else
+    //        enumvc.canbeEmpty =true;
+    enumvc.cadedate = [self.alert_cadedate mutableCopy];
+    enumvc.title = @"";
+    //       enumvc.value = [value_json mutableCopy];
+    enumvc.single_select =true;
+    
+    enumvc.returnValue = ^(NSMutableDictionary* value){
+        self.alert_cadedate = value;
+        
+        
+        NSString* alert =@"";
+        int count = [[value valueForKey:@"count"] intValue];
+        for(int i=0;i<count;i++)
+        {
+            NSDictionary* val_json =[value objectForKey:[NSString stringWithFormat:@"val_%d",i]];
+            int check = [[val_json valueForKey:@"check"] intValue];
+            if(check==1)
+            {
+                alert = [alert stringByAppendingString:[val_json valueForKey:@"value"]];
+                break;
+            }
+        }
+        
+        [self.buttonAlert setTitle:alert forState:UIControlStateNormal];
+    };
+    
+    [self.navigationController pushViewController:enumvc animated:true];
+//    
+}
+- (IBAction)onSearchClick:(id)sender {
+    
+    
+    NSArray* arrids =[self get_checkedIDs:self.categoryMenu];
+    NSString *ids=nil;
+    if(arrids.count>0)
+     ids= [arrids componentsJoinedByString:@","];
+    
+    NSString* modelname = self.textModelName.text;
+    if(modelname.length==0)
+        modelname = nil;
+    
+    NSString* modeldescrip = self.textModelDescription.text;
+    if(modeldescrip.length==0)
+        modeldescrip = nil;
+    
+    NSString* qty = [self.buttonQTY titleForState:UIControlStateNormal];
+    if(qty.length==0 || [qty isEqualToString:@"Click to select"])
+        qty = nil;
+    
+
+#if !defined(BUILD_HOMER) && !defined(BUILD_GATIT)
+    NSString* price = [self.buttonPrice titleForState:UIControlStateNormal];
+    if(price.length==0 || [price isEqualToString:@"Click to select"])
+        price = nil;
+#else
+    NSString* minprice = self.price_min.text;
+    NSString* maxprice = self.price_max.text;
+    
+    if(minprice.length==0)
+        minprice=@"0.0";
+    if(maxprice.length==0)
+        maxprice = [NSString stringWithFormat:@"%f",DBL_MAX];
+    
+    if([minprice doubleValue]>[maxprice doubleValue])
+    {
+        NSString* tempprice=minprice;
+        minprice=maxprice;
+        maxprice=tempprice;
+        self.price_min.text=minprice;
+        self.price_max.text=maxprice;
+    }
+    NSString* price = nil;
+    if(minprice.length!=0||maxprice.length!=0)
+    {
+        price = [NSString stringWithFormat:@"%@-%@",minprice,maxprice];
+    }
+#endif
+    
+#if !defined(BUILD_HOMER) && !defined(BUILD_GATIT)
+    NSString* available = [self.buttonAvailability titleForState:UIControlStateNormal];
+    if(available.length==0 || [available isEqualToString:@"Click to select"])
+        available = nil;
+#else
+    NSString* minavail = self.availability_min.text;
+    NSString* maxavail = self.availability_max.text;
+    if(minavail.length==0)
+        minavail=@"0";
+    if(maxavail.length==0)
+        maxavail = [NSString stringWithFormat:@"%d",INT_MAX];
+    
+    if([minavail intValue]>[maxavail intValue])
+    {
+        NSString* tempavail=minavail;
+        minavail=maxavail;
+        maxavail=tempavail;
+        self.availability_min.text=minavail;
+        self.availability_max.text=maxavail;
+    }
+    NSString* available = nil;
+    if(minavail.length!=0||maxavail.length!=0)
+    {
+        available = [NSString stringWithFormat:@"%@-%@",minavail,maxavail];
+    }
+#endif
+    NSString* alert = [self.buttonAlert titleForState:UIControlStateNormal];
+    if(alert.length==0 || [alert isEqualToString:@"Click to select"])
+        alert = nil;
+    
+    NSString* bestseller = [self.buttonBestSeller titleForState:UIControlStateNormal];
+    if(bestseller.length==0 || [bestseller isEqualToString:@"Click to select"])
+        bestseller = nil;
+
+    
+    if(self.OkClick)
+        self.OkClick(ids, modelname, modeldescrip,available, qty, alert,price,bestseller);
+//    [self dismissViewControllerAnimated:true completion:nil];
+    [self.navigationController popViewControllerAnimated:true];
+}
+
+
+#pragma mark - Private
+/**数据选择*/
+-(NSMutableDictionary*) check:(NSString*) cid source:(NSMutableDictionary*) json
+{
+    int count = [[json valueForKey:@"count"] intValue];
+    for(int i=0;i<count;i++)
+    {
+        NSMutableDictionary* category = [[json objectForKey:[NSString stringWithFormat:@"category_%d",i]] mutableCopy];
+        int c1 = [[category valueForKey:@"count"] intValue];
+        if(c1==0)
+        {
+            NSString* _id = [category valueForKey:@"id"];
+            if([_id isEqualToString:cid])
+            {
+                int check = [[category valueForKey:@"check"] intValue];
+                if(check==1)
+                    [  category setValue:@"0" forKey:@"check"] ;
+                else
+                    [  category setValue:@"1" forKey:@"check"] ;
+                [json setObject:category forKey:[NSString stringWithFormat:@"category_%d",i]];
+            }
+        }
+        else
+        {
+            NSMutableDictionary* ret=[self check:cid source:category];
+            
+            [json setObject:ret forKey:[NSString stringWithFormat:@"category_%d",i]];
+        }
+    }
+    return json;
+    
+    
+}
+/**判断Category是否被选中*/
+-(int) is_check:(NSString*) cid source:(NSDictionary*) json
+{
+    int count = [[json valueForKey:@"count"] intValue];
+    for(int i=0;i<count;i++)
+    {
+        NSDictionary* category = [json objectForKey:[NSString stringWithFormat:@"category_%d",i]];
+        int c1 = [[category valueForKey:@"count"] intValue];
+        if(c1==0)
+        {
+            NSString* _id = [category valueForKey:@"id"];
+            if([_id isEqualToString:cid])
+            {
+                int check = [[category valueForKey:@"check"] intValue];
+                return check;
+            }
+        }
+        else
+        {
+            int check=[self is_check:cid source:category];
+            
+            if(check!=-1)
+                return check;
+        }
+    }
+    return -1;
+    
+    
+}
+/**获取选中Category ID*/
+-(NSArray*) get_checkedIDs:(NSDictionary*) json
+{
+    
+    NSMutableArray * array = [[NSMutableArray alloc]init];
+    int count = [[json valueForKey:@"count"] intValue];
+    for(int i=0;i<count;i++)
+    {
+        NSDictionary* category = [json objectForKey:[NSString stringWithFormat:@"category_%d",i]];
+        int c1 = [[category valueForKey:@"count"] intValue];
+        if(c1==0)
+        {
+            NSString* _id = [category valueForKey:@"id"];
+            int check = [[category valueForKey:@"check"] intValue];
+            if(check==1)
+                [array addObject:_id];
+        }
+        else
+        {
+            NSArray * ret=[self get_checkedIDs:category];
+            
+            
+            for(int l=0;l<ret.count;l++)
+            {
+                [array addObject:ret[l]];
+            }
+            
+        }
+    }
+    return array ;
+
+}
+/**初始化时检查选择情况*/
+- (void)initCheckedCategory {
+    
+    NSMutableDictionary *mutableCategoryMenu = [self.categoryMenu mutableCopy];
+    NSArray *idsArr = [self.ids componentsSeparatedByString:@","];
+    for (NSString *categoryID in idsArr) {
+        [self check:categoryID source:mutableCategoryMenu];
+    }
+    self.categoryMenu = [mutableCategoryMenu copy];
+}
+
+
+#pragma mark textField delegate
+-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
+    
+    DebugLog(@"textField shouldChangeCharactersInRange");
+    DebugLog(@"text:%@",textField.text);
+    
+    
+    
+
+    NSString* keyboard = @"";
+    UIKeyboardType kbtype=textField.keyboardType;
+    
+    if(kbtype==UIKeyboardTypeNumberPad)
+        keyboard=@"int";
+    if(kbtype==UIKeyboardTypeDecimalPad)
+        keyboard=@"number";
+
+    if(![keyboard isEqualToString:@"number"] && ![keyboard isEqualToString:@"int"])
+        return TRUE;
+    NSCharacterSet *cs;
+    if([keyboard isEqualToString:@"number"])
+    {
+        if([textField.text rangeOfString:@"."].location!=NSNotFound && [string isEqualToString:@"."])
+        {
+            //已经有小数点了,不允许再输入小数点
+            return false;
+        }
+        cs = [[NSCharacterSet characterSetWithCharactersInString:NUMBERS]invertedSet];
+    }
+    else
+        cs = [[NSCharacterSet characterSetWithCharactersInString:INTNUMBERS]invertedSet];
+    
+    NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs]componentsJoinedByString:@""];
+    
+    BOOL canChange = [string isEqualToString:filtered];
+
+
+    return canChange;
+//    int lenth = [[item_json valueForKey:@"length"] intValue];
+//    if(lenth==0)
+//        return canChange;
+//    else
+//    {
+//        return canChange&& (lenth>textField.text.length ||[string isEqualToString:@""]);
+//    }
+}
+
+
+#pragma mark - Responding to keyboard events
+
+- (void)keyboardDidChangeFrame:(NSNotification *)notification {
+    DebugLog(@"keyboardDidChangeFrame");
+    
+    
+    // 使用tableContainer计算frame 保证屏幕旋转后table height正确
+    //    CGRect table_origin_screen_frame = [self.tableContainer convertRect:self.tableContainer.bounds toView:self.view.window];
+    
+    CGRect screen_rect = [RAUtils relativeFrameForScreenWithView:self.view];
+    //
+    //    //    NSTimeInterval duration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
+    //    //    duration *= 0.0;
+    CGRect end = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
+    CGFloat keyboard_top = end.origin.y;
+    DebugLog(@"keyboard rect: %@",NSStringFromCGRect(end));
+    
+    DebugLog(@"view rect: %@",NSStringFromCGRect(self.view.frame));
+    DebugLog(@"view screen rect: %@",NSStringFromCGRect(screen_rect));
+    
+    //    self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
+    
+    float dark = screen_rect.origin.y+screen_rect.size.height-keyboard_top;
+    
+    if(dark>0)
+    {
+        self.scrollView.scrollEnabled = true;
+        self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, self.scrollView.frame.size.height+dark);
+        
+    }
+    else
+    {
+        self.scrollView.scrollEnabled = false;
+        self.scrollView.contentSize = self.scrollView.frame.size;
+
+    }
+    
+    //    CGRect screenframe=[[UIScreen mainScreen] bounds];
+    //    self.autocompleteView.frame= CGRectMake(screenframe.origin.x, screenframe.origin.y, screenframe.size.width, end_y);
+    //
+    //    NSIndexPath *indexPath = [self.editorTable indexPathForCell:self.editingcell];
+    //
+    //    CGRect table_frame = self.editorTable.frame;
+    //    // table底部距离键盘顶部偏移
+    //    CGFloat offset = CGRectGetMaxY(table_origin_screen_frame) - end_y;
+    //    if (offset > 0) {
+    //
+    //        // table -> top > offset: table.y = -offset
+    //        // 事实上top:topLayoutGuide
+    //        CGFloat topAvailableHeight = (CGRectGetMinY(table_origin_screen_frame) - self.topLayoutGuide.length);
+    //        if (topAvailableHeight > 0) {
+    //            if (topAvailableHeight > offset) {
+    //                table_frame.origin.y = -offset;
+    //            } else {
+    //                // 向上移动到topLayoutGuide,不足部分通过缩减高度到达keyboard顶部
+    //                table_frame.origin.y = -topAvailableHeight;
+    //                table_frame.size.height = (end_y - self.topLayoutGuide.length);
+    //            }
+    //        } else {
+    //            // contentInset = (top = 64, left = 0, bottom = 0, right = 0),topAvailableHeight = -64
+    //            table_frame.size.height = table_origin_screen_frame.size.height - offset;
+    //        }
+    //
+    //        //        table_frame.size.height = CGRectGetHeight(table_origin_screen_frame) - (CGRectGetMaxY(table_origin_screen_frame) - end_y);
+    //    } else {
+    //        //        table_frame.size.height = CGRectGetHeight(table_origin_screen_frame);
+    //        table_frame = self.tableContainer.bounds;
+    //    }
+    //
+    //    self.editorTable.frame = table_frame;
+    //
+    //    CGRect cell_screen_frame = [self.editingcell convertRect:self.editingcell.bounds toView:self.view.window];
+    //    if (CGRectGetMaxY(cell_screen_frame) > end_y) {
+    //        // Cell 被键盘遮挡后才滚动
+    //        [self.editorTable scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];
+    //    }
+    //
+    //    // ===============================================
+    //    if (end_y >= [UIScreen mainScreen].bounds.size.height) {
+    //        self.keyboard_show = NO;
+    //    } else {
+    //        self.keyboard_show = YES;
+    //    }
+    
+}
+//- (void)keyboardWillChangeFrame:(NSNotification *)notification {
+//    DebugLog(@"keyboardWillChangeFrame");
+//
+//
+//    // 使用tableContainer计算frame 保证屏幕旋转后table height正确
+//    //    CGRect table_origin_screen_frame = [self.tableContainer convertRect:self.tableContainer.bounds toView:self.view.window];
+//
+//    CGRect screen_rect = [RAUtils relativeFrameForScreenWithView:self.view];
+//    //
+//    //    //    NSTimeInterval duration = [[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
+//    //    //    duration *= 0.0;
+//    CGRect end = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
+//    CGFloat keyboard_top = end.origin.y;
+//    DebugLog(@"keyboard rect: %@",NSStringFromCGRect(end));
+//
+//    DebugLog(@"view rect: %@",NSStringFromCGRect(self.view.frame));
+//    DebugLog(@"view screen rect: %@",NSStringFromCGRect(screen_rect));
+//
+//    //    self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
+//
+//    float dark = screen_rect.origin.y+screen_rect.size.height-keyboard_top;
+//
+//    if(dark>0)
+//    {
+//        self.scrollView.scrollEnabled = true;
+//        self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width, self.scrollView.frame.size.height+dark);
+//        self.treeView.scrollEnabled = false;
+//    }
+//    else
+//    {
+//        self.scrollView.scrollEnabled = false;
+//        self.scrollView.contentSize = self.scrollView.frame.size;
+//        self.treeView.scrollEnabled = true;
+//    }
+//
+//    //    CGRect screenframe=[[UIScreen mainScreen] bounds];
+//    //    self.autocompleteView.frame= CGRectMake(screenframe.origin.x, screenframe.origin.y, screenframe.size.width, end_y);
+//    //
+//    //    NSIndexPath *indexPath = [self.editorTable indexPathForCell:self.editingcell];
+//    //
+//    //    CGRect table_frame = self.editorTable.frame;
+//    //    // table底部距离键盘顶部偏移
+//    //    CGFloat offset = CGRectGetMaxY(table_origin_screen_frame) - end_y;
+//    //    if (offset > 0) {
+//    //
+//    //        // table -> top > offset: table.y = -offset
+//    //        // 事实上top:topLayoutGuide
+//    //        CGFloat topAvailableHeight = (CGRectGetMinY(table_origin_screen_frame) - self.topLayoutGuide.length);
+//    //        if (topAvailableHeight > 0) {
+//    //            if (topAvailableHeight > offset) {
+//    //                table_frame.origin.y = -offset;
+//    //            } else {
+//    //                // 向上移动到topLayoutGuide,不足部分通过缩减高度到达keyboard顶部
+//    //                table_frame.origin.y = -topAvailableHeight;
+//    //                table_frame.size.height = (end_y - self.topLayoutGuide.length);
+//    //            }
+//    //        } else {
+//    //            // contentInset = (top = 64, left = 0, bottom = 0, right = 0),topAvailableHeight = -64
+//    //            table_frame.size.height = table_origin_screen_frame.size.height - offset;
+//    //        }
+//    //
+//    //        //        table_frame.size.height = CGRectGetHeight(table_origin_screen_frame) - (CGRectGetMaxY(table_origin_screen_frame) - end_y);
+//    //    } else {
+//    //        //        table_frame.size.height = CGRectGetHeight(table_origin_screen_frame);
+//    //        table_frame = self.tableContainer.bounds;
+//    //    }
+//    //
+//    //    self.editorTable.frame = table_frame;
+//    //
+//    //    CGRect cell_screen_frame = [self.editingcell convertRect:self.editingcell.bounds toView:self.view.window];
+//    //    if (CGRectGetMaxY(cell_screen_frame) > end_y) {
+//    //        // Cell 被键盘遮挡后才滚动
+//    //        [self.editorTable scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionNone animated:NO];
+//    //    }
+//    //
+//    //    // ===============================================
+//    //    if (end_y >= [UIScreen mainScreen].bounds.size.height) {
+//    //        self.keyboard_show = NO;
+//    //    } else {
+//    //        self.keyboard_show = YES;
+//    //    }
+//
+//}
+
+//static float table_origin_h = 0;
+
+- (void)keyboardWillShow:(NSNotification *)notification {
+    DebugLog(@"keyboardWillShow");
+    //
+    //    if(self.keyboard_show)
+    //        return;
+    //
+    //    self.keyboard_show=true;
+    //    /*
+    //     Reduce the size of the text view so that it's not obscured by the keyboard.
+    //     Animate the resize so that it's in sync with the appearance of the keyboard.
+    //     */
+    //
+    //    NSDictionary *userInfo = [notification userInfo];
+    //
+    //    // Get the origin of the keyboard when it's displayed.
+    //    NSValue* aValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];
+    //
+    //    // Get the top of the keyboard as the y coordinate of its origin in self's view's coordinate system. The bottom of the text view's frame should align with the top of the keyboard's final position.
+    //    //    CGRect keyboardRect = [aValue CGRectValue];
+    //    CGSize keyboardSize = [aValue CGRectValue].size;
+    //    DebugLog(@"keyboard height:%f",keyboardSize.height);
+    //    // Get the duration of the animation.
+    //    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
+    //    NSTimeInterval animationDuration;
+    //    [animationDurationValue getValue:&animationDuration];
+    //
+    //
+    //    //    if(self.keyboard_h==0)
+    //    //   {
+    //    self.keyboard_h =keyboardSize.height;
+    //    CGRect cellrect_screen = [RAUtils relativeFrameForScreenWithView:self.editingcell];
+    //    CGRect rect_screen = [ UIScreen mainScreen ].bounds;
+    //
+    //    //    int vpos =self.view.frame.origin.y+self.view.frame.size.height;
+    //    //    int loginpos = self.editingcell.frame.origin.y+self.editingcell.frame.size.height;
+    //    //
+    //    int cellpos = cellrect_screen.origin.y+cellrect_screen.size.height;
+    //    //    screen.size.height-keyboardSize.height-(cellpos_screen.origin.x+cellpos_screen.size.height);
+    //    self.ioffset = cellpos-(rect_screen.size.height-keyboardSize.height);//rect_screen.size.height-keyboardSize.height-(rect_screen.origin.y+rect_screen.size.height);//keyboardSize.height -(self.view.frame.size.height-loginpos);
+    //    if(self.ioffset>0)
+    //    {
+    //        //  self.resize = true;
+    //
+    //
+    //        CGPoint contentOffsetPoint = self.editorTable.contentOffset;
+    //
+    //
+    //        contentOffsetPoint.y+=self.ioffset;
+    //
+    //        self.editorTable.contentOffset=contentOffsetPoint;
+    //
+    //
+    //        //       NSTimeInterval animationDuration = 0.30f;
+    //        //        CGRect frame = self.view.frame;
+    //        //        frame.origin.y -=self.ioffset;//view的Y轴上移
+    //        //        frame.size.height +=self.ioffset; //View的高度增加
+    //        //        self.view.frame = frame;
+    //        //        [UIView beginAnimations:@"ResizeView" context:nil];
+    //        //        [UIView setAnimationDuration:animationDuration];
+    //        //        self.view.frame = frame;
+    //        //        [UIView commitAnimations];//设置调整界面的动画效果
+    //    }
+    //
+    //    table_origin_h = self.editorTable.frame.size.height;
+    //    self.editorTable.frame = CGRectMake(0, 0, self.editorTable.frame.size.width, self.editorTable.frame.size.height-self.keyboard_h);
+    //
+    //    //    CGSize tablecontent =self.editorTable.contentSize;
+    //    //    tablecontent.height=tablecontent.height+self.keyboard_h;
+    //    //    self.editorTable.contentSize=tablecontent;
+    //    //    }
+    //    // Animate the resize of the text view's frame in sync with the keyboard's appearance.
+    //    //  [self moveInputBarWithKeyboardHeight:keyboardRect.size.height withDuration:animationDuration];
+}
+- (void)keyboardWillHide:(NSNotification *)notification {
+    DebugLog(@"keyboardWillHide");
+    
+    //    self.keyboard_show=false;
+    //    NSDictionary* userInfo = [notification userInfo];
+    //
+    //    /*
+    //     Restore the size of the text view (fill self's view).
+    //     Animate the resize so that it's in sync with the disappearance of the keyboard.
+    //     */
+    //    NSValue *animationDurationValue = [userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey];
+    //    NSTimeInterval animationDuration;
+    //    [animationDurationValue getValue:&animationDuration];
+    //    CGSize tablecontent =self.editorTable.contentSize;
+    //    tablecontent.height=tablecontent.height-self.keyboard_h;
+    //    //    self.editorTable.contentSize=tablecontent;
+    //
+    //    self.editorTable.frame = CGRectMake(0, 0, self.editorTable.frame.size.width, table_origin_h);
+    //
+    //    self.keyboard_h= 0;
+    //    DebugLog(@"before refresh %@",NSStringFromCGSize(self.editorTable.contentSize));
+    //
+    //
+    //    //    if(self.resize)
+    //    //    {
+    //    //        NSTimeInterval animationDuration = 0.30f;
+    //    //        CGRect frame = self.view.frame;
+    //    //        //    if(prewTag == textField.tag) //当结束编辑的View的TAG是上次的就移动
+    //    //        //    {   //还原界面
+    //    //        //        moveY =  prewMoveY;
+    //    //        frame.origin.y +=self.ioffset;
+    //    //        frame.size. height -=self.ioffset;
+    //    //        self.view.frame = frame;
+    //    //        //    }
+    //    //        //self.view移回原位置
+    //    //        [UIView beginAnimations:@"ResizeView" context:nil];
+    //    //        [UIView setAnimationDuration:animationDuration];
+    //    //        self.view.frame = frame;
+    //    //        [UIView commitAnimations];
+    //    //        //[textField resignFirstResponder];
+    //    //        self.ioffset=0;
+    //    //    }
+    //
+    //
+    //    //  [self moveInputBarWithKeyboardHeight:0.0 withDuration:animationDuration];
+}
+
+@end

+ 47 - 0
RedAnt iShop/iShop/RootFrame/catalog/CatalogListViewController.h

@@ -0,0 +1,47 @@
+//
+//  CatalogListViewController.h
+//  iShop
+//
+//  Created by Rui Zhang on 12/26/23.
+//
+
+#import <UIKit/UIKit.h>
+
+#import "TabViewController.h"
+#import "CategoryHeaderView.h"
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CatalogListViewController : TabViewController<UICollectionViewDataSource,UICollectionViewDelegate,UICollectionViewDelegateFlowLayout,UIScrollViewDelegate>
+
+#pragma mark view
+@property (strong, nonatomic) IBOutlet UICollectionView *collectionview;
+@property (strong, nonatomic) IBOutlet UIActivityIndicatorView *mum;
+@property (strong, nonatomic) IBOutlet CategoryHeaderView *headerView;
+@property (strong, nonatomic) IBOutlet UILabel *label_net_err;
+@property (strong, nonatomic) IBOutlet UILabel *cagegoryLabel;
+@property (weak, nonatomic) IBOutlet UIButton *btnDisplay;
+
+#pragma mark control
+@property int categoryViewType;
+
+@property long offset;
+
+@property bool loadall;
+@property bool showalert;
+@property bool showDetail;
+
+#pragma mark data
+@property (strong, nonatomic, nullable) NSMutableDictionary* category_data;
+@property (strong,nonatomic,nullable) NSString*  categoryid;
+@property (strong,nonatomic,nullable) NSString* p_alert;
+@property (strong,nonatomic,nullable) NSString* p_available;
+@property (strong,nonatomic,nullable) NSString* p_QTY;
+@property (strong,nonatomic,nullable) NSString* p_price;
+@property (strong,nonatomic,nullable) NSString* p_bestseller;
+@property (strong,nonatomic,nullable) NSString* modelname;
+@property (strong,nonatomic,nullable) NSString* modeldescrip;
+
+@end
+
+NS_ASSUME_NONNULL_END

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff