张国栋 1 月之前
父節點
當前提交
63fa7b694c
共有 100 個文件被更改,包括 1336 次插入541 次删除
  1. 46 18
      AICityProperty/AICity.xcodeproj/project.pbxproj
  2. 二進制
      AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/UserInterfaceState.xcuserstate
  3. 19 221
      AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  4. 1 0
      AICityProperty/AICity/AICity.pch
  5. 22 0
      AICityProperty/AICity/Assets.xcassets/icon 1.1.imageset/Contents.json
  6. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.1.imageset/icon 1.1@2x.png
  7. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.1.imageset/icon 1.1@3x.png
  8. 22 0
      AICityProperty/AICity/Assets.xcassets/icon 1.2.imageset/Contents.json
  9. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.2.imageset/icon 1.2@2x.png
  10. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.2.imageset/icon 1.2@3x.png
  11. 22 0
      AICityProperty/AICity/Assets.xcassets/icon 1.3 1.imageset/Contents.json
  12. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.3 1.imageset/icon 1.3@2x.png
  13. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.3 1.imageset/icon 1.3@3x.png
  14. 22 0
      AICityProperty/AICity/Assets.xcassets/icon 1.3.imageset/Contents.json
  15. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.3.imageset/icon 1.3@2x.png
  16. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.3.imageset/icon 1.3@3x.png
  17. 22 0
      AICityProperty/AICity/Assets.xcassets/icon 1.5.imageset/Contents.json
  18. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.5.imageset/icon 1.5@2x.png
  19. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.5.imageset/icon 1.5@3x.png
  20. 22 0
      AICityProperty/AICity/Assets.xcassets/icon 1.6.imageset/Contents.json
  21. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.6.imageset/icon 1.6@2x.png
  22. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 1.6.imageset/icon 1.6@3x.png
  23. 22 0
      AICityProperty/AICity/Assets.xcassets/icon 2.1 拷贝.imageset/Contents.json
  24. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 2.1 拷贝.imageset/icon 2.1 拷贝@2x.png
  25. 二進制
      AICityProperty/AICity/Assets.xcassets/icon 2.1 拷贝.imageset/icon 2.1 拷贝@3x.png
  26. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-1.1.imageset/Contents.json
  27. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-1.1.imageset/icon-1.1@2x.png
  28. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-1.1.imageset/icon-1.1@3x.png
  29. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-1.2.imageset/Contents.json
  30. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-1.2.imageset/icon-1.2@2x.png
  31. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-1.2.imageset/icon-1.2@3x.png
  32. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-1.4.imageset/Contents.json
  33. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-1.4.imageset/icon-1.4@2x.png
  34. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-1.4.imageset/icon-1.4@3x.png
  35. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-2.1.imageset/Contents.json
  36. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.1.imageset/icon-2.1@2x.png
  37. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.1.imageset/icon-2.1@3x.png
  38. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-2.2 1.imageset/Contents.json
  39. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.2 1.imageset/icon-2.2@2x.png
  40. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.2 1.imageset/icon-2.2@3x.png
  41. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-2.2(1).imageset/Contents.json
  42. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.2(1).imageset/icon-2.2@2x(1).png
  43. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.2(1).imageset/icon-2.2@3x(1).png
  44. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-2.2.imageset/Contents.json
  45. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.2.imageset/icon-2.2@2x.png
  46. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.2.imageset/icon-2.2@3x.png
  47. 22 0
      AICityProperty/AICity/Assets.xcassets/icon-2.4.imageset/Contents.json
  48. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.4.imageset/icon-2.4@2x.png
  49. 二進制
      AICityProperty/AICity/Assets.xcassets/icon-2.4.imageset/icon-2.4@3x.png
  50. 22 0
      AICityProperty/AICity/Assets.xcassets/会员-1.imageset/Contents.json
  51. 二進制
      AICityProperty/AICity/Assets.xcassets/会员-1.imageset/会员-1@2x.png
  52. 二進制
      AICityProperty/AICity/Assets.xcassets/会员-1.imageset/会员-1@3x.png
  53. 22 0
      AICityProperty/AICity/Assets.xcassets/展开-1.imageset/Contents.json
  54. 二進制
      AICityProperty/AICity/Assets.xcassets/展开-1.imageset/展开-1@2x.png
  55. 二進制
      AICityProperty/AICity/Assets.xcassets/展开-1.imageset/展开-1@3x.png
  56. 22 0
      AICityProperty/AICity/Assets.xcassets/展开-2.imageset/Contents.json
  57. 二進制
      AICityProperty/AICity/Assets.xcassets/展开-2.imageset/展开-2@2x.png
  58. 二進制
      AICityProperty/AICity/Assets.xcassets/展开-2.imageset/展开-2@3x.png
  59. 22 0
      AICityProperty/AICity/Assets.xcassets/播放 拷贝.imageset/Contents.json
  60. 二進制
      AICityProperty/AICity/Assets.xcassets/播放 拷贝.imageset/播放 拷贝@2x.png
  61. 二進制
      AICityProperty/AICity/Assets.xcassets/播放 拷贝.imageset/播放 拷贝@3x.png
  62. 100 47
      AICityProperty/AICity/JuXing/ViewControllers/JXDetailViewController.m
  63. 12 2
      AICityProperty/AICity/JuXing/ViewControllers/JXShortDramaViewController.m
  64. 34 20
      AICityProperty/AICity/JuXing/Views/JXCollectionViewController.m
  65. 77 80
      AICityProperty/AICity/JuXing/Views/JXCommentViewController.m
  66. 62 147
      AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m
  67. 2 2
      AICityProperty/AICity/Utils/GuestHelper.m
  68. 3 3
      AICityProperty/AICity/viewControlls/CTTabbarController.m
  69. 1 0
      AICityProperty/Podfile
  70. 5 1
      AICityProperty/Podfile.lock
  71. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/MJExtension.h
  72. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/MJExtensionConst.h
  73. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/MJFoundation.h
  74. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/MJProperty.h
  75. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/MJPropertyKey.h
  76. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/MJPropertyType.h
  77. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJClass.h
  78. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJCoding.h
  79. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJKeyValue.h
  80. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJProperty.h
  81. 1 0
      AICityProperty/Pods/Headers/Private/MJExtension/NSString+MJExtension.h
  82. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/MJExtension.h
  83. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/MJExtensionConst.h
  84. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/MJFoundation.h
  85. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/MJProperty.h
  86. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/MJPropertyKey.h
  87. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/MJPropertyType.h
  88. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJClass.h
  89. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJCoding.h
  90. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJKeyValue.h
  91. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJProperty.h
  92. 1 0
      AICityProperty/Pods/Headers/Public/MJExtension/NSString+MJExtension.h
  93. 19 0
      AICityProperty/Pods/MJExtension/LICENSE
  94. 27 0
      AICityProperty/Pods/MJExtension/MJExtension/MJExtension.h
  95. 111 0
      AICityProperty/Pods/MJExtension/MJExtension/MJExtensionConst.h
  96. 27 0
      AICityProperty/Pods/MJExtension/MJExtension/MJExtensionConst.m
  97. 16 0
      AICityProperty/Pods/MJExtension/MJExtension/MJFoundation.h
  98. 70 0
      AICityProperty/Pods/MJExtension/MJExtension/MJFoundation.m
  99. 53 0
      AICityProperty/Pods/MJExtension/MJExtension/MJProperty.h
  100. 211 0
      AICityProperty/Pods/MJExtension/MJExtension/MJProperty.m

+ 46 - 18
AICityProperty/AICity.xcodeproj/project.pbxproj

@@ -7,10 +7,7 @@
 	objects = {
 
 /* Begin PBXBuildFile section */
-		0C16E91E94089BA87A3D5157 /* TXLiteAVSDK_Player.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6370A38BB1231543145E7D6 /* TXLiteAVSDK_Player.xcframework */; };
 		474038340C535C2F007A377C /* libPods-AICity.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 23D0D9B98B1C7AC417D7DECD /* libPods-AICity.a */; };
-		585303091AC63C0B9BAFCB60 /* TXSoundTouch.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03D3E582982429F158D9A2C2 /* TXSoundTouch.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
-		7B6E7440B52A091CBF4CAACC /* TXFFmpeg.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 6F7FFEADE1F8D853B6160E70 /* TXFFmpeg.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
 		864F61472EA65E02003503B4 /* JXCacheManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 864F61462EA65E02003503B4 /* JXCacheManager.m */; };
 		864F614A2EA65E23003503B4 /* JXAnalytics.m in Sources */ = {isa = PBXBuildFile; fileRef = 864F61482EA65E23003503B4 /* JXAnalytics.m */; };
 		864F614B2EA65E23003503B4 /* JXMemberService.m in Sources */ = {isa = PBXBuildFile; fileRef = 864F61492EA65E23003503B4 /* JXMemberService.m */; };
@@ -62,8 +59,12 @@
 		93A566DE2EA75F5F00818C54 /* videoItemsNavCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 93A566DB2EA75F5F00818C54 /* videoItemsNavCell.h */; };
 		93A566DF2EA75F5F00818C54 /* videoItemsNavCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93A566DC2EA75F5F00818C54 /* videoItemsNavCell.m */; };
 		93A566E02EA75F5F00818C54 /* videoItemsNavCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93A566DD2EA75F5F00818C54 /* videoItemsNavCell.xib */; };
-		9C64FDF13F17889791A4EB25 /* TXFFmpeg.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F7FFEADE1F8D853B6160E70 /* TXFFmpeg.xcframework */; };
-		A6F250E5CB6093DED972D9E5 /* TXLiteAVSDK_Player.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = D6370A38BB1231543145E7D6 /* TXLiteAVSDK_Player.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
+		93CB0FE42EA7A87C00ACFECB /* CommentItemCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93CB0FE32EA7A87C00ACFECB /* CommentItemCell.xib */; };
+		93CB0FE52EA7A87C00ACFECB /* CommentItemCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93CB0FE22EA7A87C00ACFECB /* CommentItemCell.m */; };
+		93CB0FE62EA7A87C00ACFECB /* CommentItemCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 93CB0FE12EA7A87C00ACFECB /* CommentItemCell.h */; };
+		93CB0FEA2EA7AE9C00ACFECB /* CommentRpItemCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93CB0FE92EA7AE9C00ACFECB /* CommentRpItemCell.xib */; };
+		93CB0FEB2EA7AE9C00ACFECB /* CommentRpItemCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93CB0FE82EA7AE9C00ACFECB /* CommentRpItemCell.m */; };
+		93CB0FEC2EA7AE9C00ACFECB /* CommentRpItemCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 93CB0FE72EA7AE9C00ACFECB /* CommentRpItemCell.h */; };
 		A81E35FF22FECB7000F97F99 /* CoreTelephony.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A81E35FE22FECB7000F97F99 /* CoreTelephony.framework */; };
 		A81E360122FECB7800F97F99 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A81E360022FECB7800F97F99 /* CoreLocation.framework */; };
 		A81E360322FECB8600F97F99 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A81E360222FECB8600F97F99 /* Foundation.framework */; };
@@ -151,7 +152,6 @@
 		ACB426CD2A651F5800C64538 /* DelAccountViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ACB426CC2A651F5800C64538 /* DelAccountViewController.m */; };
 		ACB426D02A67A56900C64538 /* ZFPortraitControlView2.m in Sources */ = {isa = PBXBuildFile; fileRef = ACB426CF2A67A56900C64538 /* ZFPortraitControlView2.m */; };
 		ACB426D32A67F96500C64538 /* AccountCenterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ACB426D22A67F96500C64538 /* AccountCenterViewController.m */; };
-		B8F2722EEFFEB32637B3FC2A /* TXSoundTouch.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03D3E582982429F158D9A2C2 /* TXSoundTouch.xcframework */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -178,9 +178,6 @@
 			dstPath = "";
 			dstSubfolderSpec = 10;
 			files = (
-				A6F250E5CB6093DED972D9E5 /* TXLiteAVSDK_Player.xcframework in Embed Frameworks */,
-				7B6E7440B52A091CBF4CAACC /* TXFFmpeg.xcframework in Embed Frameworks */,
-				585303091AC63C0B9BAFCB60 /* TXSoundTouch.xcframework in Embed Frameworks */,
 			);
 			name = "Embed Frameworks";
 			runOnlyForDeploymentPostprocessing = 0;
@@ -188,10 +185,8 @@
 /* End PBXCopyFilesBuildPhase section */
 
 /* Begin PBXFileReference section */
-		03D3E582982429F158D9A2C2 /* TXSoundTouch.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = TXSoundTouch.xcframework; path = Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/TXSoundTouch.xcframework; sourceTree = SOURCE_ROOT; };
 		23D0D9B98B1C7AC417D7DECD /* libPods-AICity.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AICity.a"; sourceTree = BUILT_PRODUCTS_DIR; };
 		308ABD3914DE5B79CAAAE924 /* Pods-AICity.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AICity.release.xcconfig"; path = "Pods/Target Support Files/Pods-AICity/Pods-AICity.release.xcconfig"; sourceTree = "<group>"; };
-		6F7FFEADE1F8D853B6160E70 /* TXFFmpeg.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = TXFFmpeg.xcframework; path = Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/TXFFmpeg.xcframework; sourceTree = SOURCE_ROOT; };
 		810F0061C93A3FEB2B3D43FF /* Pods-AICity.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AICity.release.xcconfig"; path = "Pods/Target Support Files/Pods-AICity/Pods-AICity.release.xcconfig"; sourceTree = "<group>"; };
 		864F61462EA65E02003503B4 /* JXCacheManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = JXCacheManager.m; path = AICity/JuXing/Services/JXCacheManager.m; sourceTree = "<group>"; };
 		864F61482EA65E23003503B4 /* JXAnalytics.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = JXAnalytics.m; path = AICity/JuXing/Services/JXAnalytics.m; sourceTree = "<group>"; };
@@ -253,6 +248,12 @@
 		93A566DB2EA75F5F00818C54 /* videoItemsNavCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = videoItemsNavCell.h; sourceTree = "<group>"; };
 		93A566DC2EA75F5F00818C54 /* videoItemsNavCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = videoItemsNavCell.m; sourceTree = "<group>"; };
 		93A566DD2EA75F5F00818C54 /* videoItemsNavCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = videoItemsNavCell.xib; sourceTree = "<group>"; };
+		93CB0FE12EA7A87C00ACFECB /* CommentItemCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommentItemCell.h; sourceTree = "<group>"; };
+		93CB0FE22EA7A87C00ACFECB /* CommentItemCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CommentItemCell.m; sourceTree = "<group>"; };
+		93CB0FE32EA7A87C00ACFECB /* CommentItemCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CommentItemCell.xib; sourceTree = "<group>"; };
+		93CB0FE72EA7AE9C00ACFECB /* CommentRpItemCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommentRpItemCell.h; sourceTree = "<group>"; };
+		93CB0FE82EA7AE9C00ACFECB /* CommentRpItemCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CommentRpItemCell.m; sourceTree = "<group>"; };
+		93CB0FE92EA7AE9C00ACFECB /* CommentRpItemCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CommentRpItemCell.xib; sourceTree = "<group>"; };
 		A81E35FE22FECB7000F97F99 /* CoreTelephony.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreTelephony.framework; path = System/Library/Frameworks/CoreTelephony.framework; sourceTree = SDKROOT; };
 		A81E360022FECB7800F97F99 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
 		A81E360222FECB8600F97F99 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
@@ -416,7 +417,6 @@
 		ACB426D12A67F96500C64538 /* AccountCenterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AccountCenterViewController.h; sourceTree = "<group>"; };
 		ACB426D22A67F96500C64538 /* AccountCenterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AccountCenterViewController.m; sourceTree = "<group>"; };
 		BA3E7E51F76A4C13B5E5A575 /* Pods-AICity.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AICity.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AICity/Pods-AICity.debug.xcconfig"; sourceTree = "<group>"; };
-		D6370A38BB1231543145E7D6 /* TXLiteAVSDK_Player.xcframework */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = wrapper.xcframework; name = TXLiteAVSDK_Player.xcframework; path = Pods/TXLiteAVSDK_Player/TXLiteAVSDK_Player/TXLiteAVSDK_Player.xcframework; sourceTree = SOURCE_ROOT; };
 		DFE8373DF63B74B633D7BD72 /* Pods-AICity.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AICity.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AICity/Pods-AICity.debug.xcconfig"; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
@@ -439,9 +439,6 @@
 				A82A082422FA6137000768B3 /* MobileCoreServices.framework in Frameworks */,
 				A8BD961622EA94E6001EC796 /* CoreServices.framework in Frameworks */,
 				474038340C535C2F007A377C /* libPods-AICity.a in Frameworks */,
-				0C16E91E94089BA87A3D5157 /* TXLiteAVSDK_Player.xcframework in Frameworks */,
-				9C64FDF13F17889791A4EB25 /* TXFFmpeg.xcframework in Frameworks */,
-				B8F2722EEFFEB32637B3FC2A /* TXSoundTouch.xcframework in Frameworks */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -482,6 +479,12 @@
 				93A566DB2EA75F5F00818C54 /* videoItemsNavCell.h */,
 				93A566DC2EA75F5F00818C54 /* videoItemsNavCell.m */,
 				93A566DD2EA75F5F00818C54 /* videoItemsNavCell.xib */,
+				93CB0FE12EA7A87C00ACFECB /* CommentItemCell.h */,
+				93CB0FE22EA7A87C00ACFECB /* CommentItemCell.m */,
+				93CB0FE32EA7A87C00ACFECB /* CommentItemCell.xib */,
+				93CB0FE72EA7AE9C00ACFECB /* CommentRpItemCell.h */,
+				93CB0FE82EA7AE9C00ACFECB /* CommentRpItemCell.m */,
+				93CB0FE92EA7AE9C00ACFECB /* CommentRpItemCell.xib */,
 				93A566D82EA73C7500818C54 /* EXTView */,
 			);
 			path = viewsNew;
@@ -556,9 +559,6 @@
 				A873709322DD993A002F651C /* Products */,
 				A8BD961422EA94E6001EC796 /* Frameworks */,
 				6CB90FA8BA5983EA68153DF7 /* Pods */,
-				D6370A38BB1231543145E7D6 /* TXLiteAVSDK_Player.xcframework */,
-				6F7FFEADE1F8D853B6160E70 /* TXFFmpeg.xcframework */,
-				03D3E582982429F158D9A2C2 /* TXSoundTouch.xcframework */,
 			);
 			sourceTree = "<group>";
 		};
@@ -964,7 +964,9 @@
 				93A566CE2EA72F4A00818C54 /* GDNavigationController.h in Headers */,
 				93A566DA2EA73C7500818C54 /* EXTView.h in Headers */,
 				93A566D32EA7387800818C54 /* videoItemsCell.h in Headers */,
+				93CB0FE62EA7A87C00ACFECB /* CommentItemCell.h in Headers */,
 				93A566DE2EA75F5F00818C54 /* videoItemsNavCell.h in Headers */,
+				93CB0FEC2EA7AE9C00ACFECB /* CommentRpItemCell.h in Headers */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
@@ -982,6 +984,7 @@
 				A873709022DD993A002F651C /* Resources */,
 				DB53231C3F1DDB56B0E13BD2 /* [CP] Copy Pods Resources */,
 				A5AE6E85C682F07BE79262F6 /* Embed Frameworks */,
+				D5B88E364A8F52C80FED91DA /* [CP] Embed Pods Frameworks */,
 			);
 			buildRules = (
 			);
@@ -1077,9 +1080,11 @@
 			files = (
 				93A566E02EA75F5F00818C54 /* videoItemsNavCell.xib in Resources */,
 				93A566D52EA7387800818C54 /* videoItemsCell.xib in Resources */,
+				93CB0FEA2EA7AE9C00ACFECB /* CommentRpItemCell.xib in Resources */,
 				A87370A222DD993D002F651C /* LaunchScreen.storyboard in Resources */,
 				A873709F22DD993D002F651C /* Assets.xcassets in Resources */,
 				AC84AB472A5968DE00317AFC /* ZFRotationViewController.xib in Resources */,
+				93CB0FE42EA7A87C00ACFECB /* CommentItemCell.xib in Resources */,
 				AC84AB5A2A5968DE00317AFC /* data.json in Resources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
@@ -1119,6 +1124,27 @@
 			shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n    # print error to STDERR\n    echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n    exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
 			showEnvVarsInLog = 0;
 		};
+		D5B88E364A8F52C80FED91DA /* [CP] Embed Pods Frameworks */ = {
+			isa = PBXShellScriptBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+			);
+			inputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-AICity/Pods-AICity-frameworks-${CONFIGURATION}-input-files.xcfilelist",
+			);
+			inputPaths = (
+			);
+			name = "[CP] Embed Pods Frameworks";
+			outputFileListPaths = (
+				"${PODS_ROOT}/Target Support Files/Pods-AICity/Pods-AICity-frameworks-${CONFIGURATION}-output-files.xcfilelist",
+			);
+			outputPaths = (
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+			shellPath = /bin/sh;
+			shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-AICity/Pods-AICity-frameworks.sh\"\n";
+			showEnvVarsInLog = 0;
+		};
 		DB53231C3F1DDB56B0E13BD2 /* [CP] Copy Pods Resources */ = {
 			isa = PBXShellScriptBuildPhase;
 			buildActionMask = 2147483647;
@@ -1209,6 +1235,7 @@
 				AC84AB5F2A5968DE00317AFC /* ZFTableHeaderView.m in Sources */,
 				AC84AB562A5968DE00317AFC /* ZFTableHeaderViewController.m in Sources */,
 				AC84AB592A5968DE00317AFC /* ZFTableData.m in Sources */,
+				93CB0FEB2EA7AE9C00ACFECB /* CommentRpItemCell.m in Sources */,
 				AC5EF8412A5FCD4700E76F94 /* PlayHistoryViewController.m in Sources */,
 				AC84AB5D2A5968DE00317AFC /* ZFTableViewCell.m in Sources */,
 				AC84AB4F2A5968DE00317AFC /* NSString+Size.m in Sources */,
@@ -1233,6 +1260,7 @@
 				AC84AB572A5968DE00317AFC /* ZFWChatViewController.m in Sources */,
 				AC5EF84D2A6192C200E76F94 /* ZFLandScapeControlView2.m in Sources */,
 				AC84AABE2A56D4E400317AFC /* CTPageControl.m in Sources */,
+				93CB0FE52EA7A87C00ACFECB /* CommentItemCell.m in Sources */,
 				AC85449E2A69213600920569 /* UserProtocolViewController.m in Sources */,
 				ACB426CD2A651F5800C64538 /* DelAccountViewController.m in Sources */,
 				AC9A8C8A2A5D5162000CC169 /* UserModel.m in Sources */,

二進制
AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/UserInterfaceState.xcuserstate


+ 19 - 221
AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -7,267 +7,65 @@
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "C66EB0BB-4EE6-45D7-94E8-ED105ECBAFF3"
+            uuid = "E47ED7BF-E61F-4BFB-ADAD-F058AC662447"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/ViewControllers/JXShortDramaViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "623"
-            endingLineNumber = "623"
-            landmarkName = "-shortDramaCellDidTapComment:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "39660437-9031-4A1C-B7D8-103BDDF2C1C6"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/ViewControllers/JXShortDramaViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "625"
-            endingLineNumber = "625"
-            landmarkName = "-shortDramaCellDidTapComment:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "5D9DAF64-3F58-4D2F-8945-04452DB9C960"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/ViewControllers/JXShortDramaViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "604"
-            endingLineNumber = "604"
-            landmarkName = "-shortDramaCellDidTapFavorite:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "3D926B67-046F-43E8-B1D0-AAF0B0EAD54C"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/ViewControllers/JXShortDramaViewController.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "594"
-            endingLineNumber = "594"
-            landmarkName = "-shortDramaCellDidTapLike:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "2C810CA6-73E6-4B82-A988-6A08BC70103D"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/ViewControllers/JXShortDramaViewController.m"
+            filePath = "AICity/JuXing/Services/JXAPIService.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "739"
-            endingLineNumber = "739"
-            landmarkName = "-showCommentDialogWithDramaId:"
+            startingLineNumber = "229"
+            endingLineNumber = "229"
+            landmarkName = "-getInteractionDataWithDramaId:episodeId:success:failure:"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "2E5C9E79-5668-40EE-9B1A-D79CB3008170"
+            uuid = "E58016ED-4038-4CF5-A643-9FF8796B290E"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/Views/JXShortDramaCell.m"
+            filePath = "AICity/Utils/GuestHelper.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "502"
-            endingLineNumber = "502"
-            landmarkName = "-handleCommentTap"
+            startingLineNumber = "34"
+            endingLineNumber = "34"
+            landmarkName = "-checkLoginWithViewController:action:"
             landmarkType = "7">
-            <Locations>
-               <Location
-                  uuid = "2E5C9E79-5668-40EE-9B1A-D79CB3008170 - 1d9684e7209acf"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "-[JXShortDramaCell handleCommentTap]"
-                  moduleName = "AICity"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Users/zhangguodong/AICityProperty/AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "526"
-                  endingLineNumber = "526">
-               </Location>
-               <Location
-                  uuid = "2E5C9E79-5668-40EE-9B1A-D79CB3008170 - 1d9684e7209fa7"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "-[JXShortDramaCell handleCommentTap]"
-                  moduleName = "AICity"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Users/zhangguodong/AICityProperty/AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "502"
-                  endingLineNumber = "502">
-               </Location>
-            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "15C21FA9-8065-4BC2-8D1F-AB2591BE27F2"
+            uuid = "45147146-FECD-47F8-BC31-AD09815C537F"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/Views/JXShortDramaCell.m"
+            filePath = "AICity/Utils/GuestHelper.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "489"
-            endingLineNumber = "489"
-            landmarkName = "-handleFavoriteTap"
+            startingLineNumber = "38"
+            endingLineNumber = "38"
+            landmarkName = "-checkLoginWithViewController:action:"
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent
-            uuid = "850E0B04-B3BA-46C6-AC43-94161DFEE37D"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/Views/JXShortDramaCell.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "479"
-            endingLineNumber = "479"
-            landmarkName = "-handleLikeTap"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "BC416679-B984-4A12-B542-C00A4E803DBF"
+            uuid = "C920EC78-1762-4F26-87AD-8C6CFFC287A0"
             shouldBeEnabled = "Yes"
             ignoreCount = "0"
             continueAfterRunningActions = "No"
             filePath = "AICity/JuXing/ViewControllers/JXShortDramaViewController.m"
             startingColumnNumber = "9223372036854775807"
             endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "621"
-            endingLineNumber = "621"
-            landmarkName = "-shortDramaCellDidTapComment:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "17760A9C-D9A6-467C-A90D-350526578399"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/Views/JXShortDramaCell.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "501"
-            endingLineNumber = "501"
-            landmarkName = "-handleCommentTap"
-            landmarkType = "7">
-            <Locations>
-               <Location
-                  uuid = "17760A9C-D9A6-467C-A90D-350526578399 - 1d9684e7209f84"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "-[JXShortDramaCell handleCommentTap]"
-                  moduleName = "AICity"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Users/zhangguodong/AICityProperty/AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "501"
-                  endingLineNumber = "501">
-               </Location>
-               <Location
-                  uuid = "17760A9C-D9A6-467C-A90D-350526578399 - 1d9684e7209fa7"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "-[JXShortDramaCell handleCommentTap]"
-                  moduleName = "AICity"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Users/zhangguodong/AICityProperty/AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "502"
-                  endingLineNumber = "502">
-               </Location>
-            </Locations>
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "753641C3-95E7-4D0D-A521-18DA03536430"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/JuXing/Views/JXShortDramaCell.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "498"
-            endingLineNumber = "498"
-            landmarkName = "-handleCommentTap2"
+            startingLineNumber = "638"
+            endingLineNumber = "638"
+            landmarkName = "-shortDramaCellDidTapDetail:"
             landmarkType = "7">
-            <Locations>
-               <Location
-                  uuid = "753641C3-95E7-4D0D-A521-18DA03536430 - 1d9684e7209e65"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "-[JXShortDramaCell handleCommentTap]"
-                  moduleName = "AICity"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Users/zhangguodong/AICityProperty/AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "500"
-                  endingLineNumber = "500">
-               </Location>
-               <Location
-                  uuid = "753641C3-95E7-4D0D-A521-18DA03536430 - f3dcf0282aa60919"
-                  shouldBeEnabled = "Yes"
-                  ignoreCount = "0"
-                  continueAfterRunningActions = "No"
-                  symbolName = "-[JXShortDramaCell handleCommentTap2]"
-                  moduleName = "AICity"
-                  usesParentBreakpointCondition = "Yes"
-                  urlString = "file:///Users/zhangguodong/AICityProperty/AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m"
-                  startingColumnNumber = "9223372036854775807"
-                  endingColumnNumber = "9223372036854775807"
-                  startingLineNumber = "499"
-                  endingLineNumber = "499">
-               </Location>
-            </Locations>
          </BreakpointContent>
       </BreakpointProxy>
    </Breakpoints>

+ 1 - 0
AICityProperty/AICity/AICity.pch

@@ -67,4 +67,5 @@
 #import <MBProgressHUD.h>
 #import "MBProgressHUD+MJ.h"
 #import "GDNavigationController.h"
+#import "MJExtension.h"
 #endif /* AICity_pch */

+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon 1.1.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon 1.1.imageset/icon 1.1@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon 1.1.imageset/icon 1.1@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon 1.2.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon 1.2.imageset/icon 1.2@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon 1.2.imageset/icon 1.2@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon 1.3 1.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon 1.3 1.imageset/icon 1.3@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon 1.3 1.imageset/icon 1.3@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon 1.3.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon 1.3.imageset/icon 1.3@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon 1.3.imageset/icon 1.3@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon 1.5.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon 1.5.imageset/icon 1.5@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon 1.5.imageset/icon 1.5@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon 1.6.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon 1.6.imageset/icon 1.6@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon 1.6.imageset/icon 1.6@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon 2.1 拷贝.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "icon 2.1 拷贝@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "icon 2.1 拷贝@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
AICityProperty/AICity/Assets.xcassets/icon 2.1 拷贝.imageset/icon 2.1 拷贝@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon 2.1 拷贝.imageset/icon 2.1 拷贝@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-1.1.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon-1.1.imageset/icon-1.1@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon-1.1.imageset/icon-1.1@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-1.2.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon-1.2.imageset/icon-1.2@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon-1.2.imageset/icon-1.2@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-1.4.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon-1.4.imageset/icon-1.4@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon-1.4.imageset/icon-1.4@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-2.1.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon-2.1.imageset/icon-2.1@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon-2.1.imageset/icon-2.1@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-2.2 1.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon-2.2 1.imageset/icon-2.2@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon-2.2 1.imageset/icon-2.2@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-2.2(1).imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "icon-2.2@2x(1).png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "icon-2.2@3x(1).png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
AICityProperty/AICity/Assets.xcassets/icon-2.2(1).imageset/icon-2.2@2x(1).png


二進制
AICityProperty/AICity/Assets.xcassets/icon-2.2(1).imageset/icon-2.2@3x(1).png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-2.2.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon-2.2.imageset/icon-2.2@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon-2.2.imageset/icon-2.2@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/icon-2.4.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/icon-2.4.imageset/icon-2.4@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/icon-2.4.imageset/icon-2.4@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/会员-1.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/会员-1.imageset/会员-1@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/会员-1.imageset/会员-1@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/展开-1.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/展开-1.imageset/展开-1@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/展开-1.imageset/展开-1@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/展开-2.imageset/Contents.json

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

二進制
AICityProperty/AICity/Assets.xcassets/展开-2.imageset/展开-2@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/展开-2.imageset/展开-2@3x.png


+ 22 - 0
AICityProperty/AICity/Assets.xcassets/播放 拷贝.imageset/Contents.json

@@ -0,0 +1,22 @@
+{
+  "images" : [
+    {
+      "idiom" : "universal",
+      "scale" : "1x"
+    },
+    {
+      "filename" : "播放 拷贝@2x.png",
+      "idiom" : "universal",
+      "scale" : "2x"
+    },
+    {
+      "filename" : "播放 拷贝@3x.png",
+      "idiom" : "universal",
+      "scale" : "3x"
+    }
+  ],
+  "info" : {
+    "author" : "xcode",
+    "version" : 1
+  }
+}

二進制
AICityProperty/AICity/Assets.xcassets/播放 拷贝.imageset/播放 拷贝@2x.png


二進制
AICityProperty/AICity/Assets.xcassets/播放 拷贝.imageset/播放 拷贝@3x.png


+ 100 - 47
AICityProperty/AICity/JuXing/ViewControllers/JXDetailViewController.m

@@ -15,8 +15,8 @@
 #import "JXAVPlayer.h"
 #import "JXSuperPlayer.h"
 #import <AVFoundation/AVFoundation.h>
-
-@interface JXDetailViewController () <JXSuperPlayerDelegate, UICollectionViewDelegate, UICollectionViewDataSource>
+#import "JXCollectionViewController.h"
+@interface JXDetailViewController () <JXSuperPlayerDelegate, UICollectionViewDelegate, UICollectionViewDataSource,JXCollectionViewControllerDelegate>
 
 // 播放器
 @property (nonatomic, strong) UIView *playerContainer;
@@ -174,76 +174,129 @@
     CGFloat height = cell.contentView.bounds.size.height;
     
     // 播放器容器(占据上半部分)
-    CGFloat playerHeight = height * 0.6;
+    CGFloat playerHeight = height;
     UIView *playerContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, playerHeight)];
     playerContainer.backgroundColor = [UIColor blackColor];
     [cell.contentView addSubview:playerContainer];
-    
+    [cell.contentView sendSubviewToBack:playerContainer];
     // 创建播放器
     JXSuperPlayer *player = [[JXSuperPlayer alloc] initWithContainerView:playerContainer];
     player.delegate = self;
     
-    CGFloat y = playerHeight + 10;
     
     // 标题
-    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, y, width - 100, 40)];
-    titleLabel.font = [UIFont boldSystemFontOfSize:18];
-    titleLabel.textColor = [UIColor whiteColor];
-    titleLabel.numberOfLines = 2;
-    [cell.contentView addSubview:titleLabel];
+   
     
     // 右侧互动按钮
-    [self setupInteractionButtonsForCell:cell atY:y];
-    
-    y += 50;
-    
-    // 描述
-    UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, y, width - 32, 40)];
-    descLabel.font = [UIFont systemFontOfSize:14];
-    descLabel.textColor = [UIColor lightGrayColor];
+//    [self setupInteractionButtonsForCell:cell atY:y];
+    
+   
+    
+    
+    
+    UILabel * seeL = [[UILabel alloc] initWithFrame:CGRectMake(16, kScreenHeight - 14-safebottom, SCREEN_WIDTH - 32, 14)];
+    seeL.font = [UIFont systemFontOfSize:14 weight:UIFontWeightMedium];
+    seeL.textColor = [UIColor colorWithRed:173/255.0 green:173/255.0 blue:173/255.0 alpha:1];
+    [cell.contentView addSubview:seeL];
+    seeL.text = [NSString stringWithFormat:@"%@次播放",@"30万"];
+    
+    
+    UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, CGRectGetMinY(seeL.frame) - 58, SCREEN_WIDTH, 38)];
+    bottomView.backgroundColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.1];
+    [cell.contentView addSubview:bottomView];
+    UIImageView *sImgView = [[UIImageView alloc] initWithFrame:CGRectMake(16, 10.5, 17, 17)];
+    sImgView.image = [UIImage imageNamed:@"icon 2.1 拷贝"];
+    [bottomView addSubview:sImgView];
+    UILabel *hjL = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(sImgView.frame)+4, 0, 100, 38)];
+    [bottomView addSubview:hjL];
+    hjL.font = [UIFont boldSystemFontOfSize:18];
+    hjL.textColor = UIColor.whiteColor;
+    hjL.text = @"合集";
+    UIImageView *mImgView = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-27, 13.5, 11, 11)];
+    mImgView.image = [UIImage imageNamed:@"Frame 9366"];
+    [bottomView addSubview:mImgView];
+    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showHJ:)];
+    [bottomView addGestureRecognizer:tap];
+    
+    UILabel *descLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, CGRectGetMinY(bottomView.frame)-60, width - 32, 40)];
+    descLabel.font = [UIFont systemFontOfSize:15 weight:UIFontWeightMedium];
+    descLabel.textColor = [UIColor whiteColor];
     descLabel.numberOfLines = 2;
     [cell.contentView addSubview:descLabel];
+    [cell.contentView bringSubviewToFront:descLabel];
     
-    y += 50;
-    
-    // 作者
-    UILabel *authorLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, y, width - 32, 20)];
-    authorLabel.font = [UIFont systemFontOfSize:13];
-    authorLabel.textColor = [UIColor grayColor];
-    [cell.contentView addSubview:authorLabel];
     
-    y += 30;
-    
-    // 剧集信息区域
-    UIView *episodeInfoView = [[UIView alloc] initWithFrame:CGRectMake(0, y, width, height - y)];
-    episodeInfoView.backgroundColor = [UIColor colorWithWhite:0.1 alpha:1.0];
-    [cell.contentView addSubview:episodeInfoView];
+    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, CGRectGetMinY(descLabel.frame) - 50, width - 100, 40)];
+    titleLabel.font = [UIFont boldSystemFontOfSize:18];
+    titleLabel.textColor = [UIColor whiteColor];
+    titleLabel.numberOfLines = 2;
+    [cell.contentView addSubview:titleLabel];
+    [cell.contentView bringSubviewToFront:titleLabel];
+    
+//    // 作者
+//    UILabel *authorLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, y, width - 32, 20)];
+//    authorLabel.font = [UIFont systemFontOfSize:13];
+//    authorLabel.textColor = [UIColor grayColor];
+//    [cell.contentView addSubview:authorLabel];
+//    
+//    [cell.contentView bringSubviewToFront:authorLabel];
+//    y += 30;
+    
+//    // 剧集信息区域
+//    UIView *episodeInfoView = [[UIView alloc] initWithFrame:CGRectMake(0, y, width, height - y)];
+//    episodeInfoView.backgroundColor = [UIColor colorWithWhite:0.1 alpha:1.0];
+//    [cell.contentView addSubview:episodeInfoView];
     
     JXEpisode *episode = self.episodes[indexPath.item];
-    
-    // 更新标签
+//    
+//    // 更新标签
     titleLabel.text = self.drama.title ?: @"";
     descLabel.text = self.drama.desc ?: @"";
-    authorLabel.text = [NSString stringWithFormat:@"@%@", self.drama.authorInfo ?: @"未知"];
-    
-    // 剧集编号和标题
-    UILabel *episodeTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, 20, width - 32, 40)];
-    NSString *episodeTitle = [NSString stringWithFormat:@"第%ld集", (long)episode.episodeNumber];
-    if (episode.title && episode.title.length > 0) {
-        episodeTitle = [NSString stringWithFormat:@"%@ - %@", episodeTitle, episode.title];
-    }
-    episodeTitleLabel.text = episodeTitle;
-    episodeTitleLabel.font = [UIFont boldSystemFontOfSize:16];
-    episodeTitleLabel.textColor = [UIColor whiteColor];
-    episodeTitleLabel.numberOfLines = 2;
-    [episodeInfoView addSubview:episodeTitleLabel];
+//    authorLabel.text = [NSString stringWithFormat:@"@%@", self.drama.authorInfo ?: @"未知"];
+//    
+//    // 剧集编号和标题
+//    UILabel *episodeTitleLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, 20, width - 32, 40)];
+//    NSString *episodeTitle = [NSString stringWithFormat:@"第%ld集", (long)episode.episodeNumber];
+//    if (episode.title && episode.title.length > 0) {
+//        episodeTitle = [NSString stringWithFormat:@"%@ - %@", episodeTitle, episode.title];
+//    }
+//    episodeTitleLabel.text = episodeTitle;
+//    episodeTitleLabel.font = [UIFont boldSystemFontOfSize:16];
+//    episodeTitleLabel.textColor = [UIColor whiteColor];
+//    episodeTitleLabel.numberOfLines = 2;
+//    [episodeInfoView addSubview:episodeTitleLabel];
     
     // 播放视频
     [player playWithAppId:episode.appId fileId:episode.fileId psign:episode.psign];
     
     return cell;
 }
-
+- (void)showHJ:(UIGestureRecognizer *)gtr{
+    JXEpisode *episode = self.episodes[self.currentEpisodeIndex];
+    [self showCollectionDialogWithDramaId:[NSString stringWithFormat:@"%ld",episode.dramaId]];
+}
+- (void)showCollectionDialogWithDramaId:(NSString *)dramaId {
+    JXCollectionViewController *collectionVC = [[JXCollectionViewController alloc] initWithDramaId:dramaId];
+    collectionVC.delegate = self;
+    
+    // 设置弹窗样式(底部弹出)
+    if (@available(iOS 15.0, *)) {
+        UISheetPresentationController *sheet = collectionVC.sheetPresentationController;
+        sheet.detents = @[
+            [UISheetPresentationControllerDetent mediumDetent],
+            [UISheetPresentationControllerDetent largeDetent]
+        ];
+        sheet.prefersGrabberVisible = YES;
+    }
+    
+    [self presentViewController:collectionVC animated:YES completion:nil];
+}
+- (void)collectionViewControllerDidSelectEpisode:(NSString *)episodeId {
+    NSLog(@"[JXShortDrama] 选择播放剧集: %@", episodeId);
+    
+    // TODO: 切换到选定的剧集播放
+    // 可以找到对应的短剧,然后滚动到该位置并播放
+}
 #pragma mark - UICollectionViewDelegate
 
 - (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath {

+ 12 - 2
AICityProperty/AICity/JuXing/ViewControllers/JXShortDramaViewController.m

@@ -190,7 +190,7 @@ static NSString * const kDramaCellIdentifier = @"JXShortDramaCell";
         }
         
         [self.collectionView reloadData];
-        
+        [self.collectionView setContentOffset:CGPointMake(0, 0) animated:YES];
         // 首次加载后,只有用户已访问才自动播放
         if (!append && models.count > 0) {
             if (self.hasUserVisited) {
@@ -554,7 +554,7 @@ static NSString * const kDramaCellIdentifier = @"JXShortDramaCell";
     BOOL isLoggedIn = [[GuestHelper sharedHelper] checkLoginWithViewController:self action:^{
         NSLog(@"[JXShortDrama] 💬 登录完成,重新调用 handleCommentButtonAtIndex");
         // 登录成功后重新打开评论
-        [self handleCommentButtonAtIndex:index];
+       
     }];
     
     NSLog(@"[JXShortDrama] 💬 登录检查结果: %@", isLoggedIn ? @"已登录 ✅" : @"未登录,等待登录");
@@ -781,6 +781,16 @@ static NSString * const kDramaCellIdentifier = @"JXShortDramaCell";
 - (void)collectionViewControllerDidSelectEpisode:(NSString *)episodeId {
     NSLog(@"[JXShortDrama] 选择播放剧集: %@", episodeId);
     
+    //先用加数据
+    JXDramaContent *drama = self.dramaList[0];
+    JXDetailViewController *detailVC = [[JXDetailViewController alloc] initWithDramaId:[@(drama.dramaId) stringValue]];
+    [self.navigationController pushViewController:detailVC animated:YES];
+    
+    
+//    JXDetailViewController *detailVC = [[JXDetailViewController alloc] initWithDramaId:episodeId];
+//    [self.navigationController pushViewController:detailVC animated:YES];
+    
+    
     // TODO: 切换到选定的剧集播放
     // 可以找到对应的短剧,然后滚动到该位置并播放
 }

+ 34 - 20
AICityProperty/AICity/JuXing/Views/JXCollectionViewController.m

@@ -127,15 +127,16 @@
         [self.headerView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
         [self.headerView.heightAnchor constraintEqualToConstant:80],
         
-        [self.headImg.topAnchor constraintEqualToAnchor:self.headerView.topAnchor constant:16],
+        [self.headImg.topAnchor constraintEqualToAnchor:self.headerView.topAnchor constant:14.5],
         [self.headImg.leadingAnchor constraintEqualToAnchor:self.headerView.leadingAnchor constant:16],
         [self.headImg.widthAnchor constraintEqualToConstant:17],
-        [self.headImg.heightAnchor constraintEqualToConstant:17],
+        [self.headImg.heightAnchor constraintEqualToConstant:16.5],
         
-        [self.titleLabel.topAnchor constraintEqualToAnchor:self.headerView.topAnchor constant:16],
+        [self.titleLabel.topAnchor constraintEqualToAnchor:self.headerView.topAnchor constant:14.5],
         [self.titleLabel.leadingAnchor constraintEqualToAnchor:self.headerView.leadingAnchor constant:41],
+        [self.titleLabel.heightAnchor constraintEqualToConstant:16.5],
         
-        [self.statsLabel.topAnchor constraintEqualToAnchor:self.titleLabel.bottomAnchor constant:4],
+        [self.statsLabel.topAnchor constraintEqualToAnchor:self.titleLabel.bottomAnchor constant:10],
         [self.statsLabel.leadingAnchor constraintEqualToAnchor:self.headerView.leadingAnchor constant:16],
         
         [self.closeButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-16],
@@ -223,14 +224,14 @@
         [self.collectionViewNav.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor],
         [self.collectionViewNav.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
         [self.collectionViewNav.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
-        [self.collectionViewNav.heightAnchor constraintEqualToConstant:50],
+        [self.collectionViewNav.heightAnchor constraintEqualToConstant:31],
     ]];
 }
 - (void)setupCollectionView {
     UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
     layout.scrollDirection = UICollectionViewScrollDirectionVertical;
-    layout.minimumLineSpacing = 12;
-    layout.minimumInteritemSpacing = 12;
+    layout.minimumLineSpacing = 0;
+    layout.minimumInteritemSpacing = 0;
     layout.sectionInset = UIEdgeInsetsMake(16, 16, 16, 16);
     
     self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout:layout];
@@ -259,8 +260,8 @@
         NSDictionary *dramaDict = response[@"data"];
         
         // 解析短剧信息
-        self.drama = [[JXDrama alloc] initWithDictionary:dramaDict];
-        
+//        self.drama = [[JXDrama alloc] initWithDictionary:dramaDict];
+        self.drama = [JXDrama mj_objectWithKeyValues:dramaDict context:nil];
         // 解析剧集列表
         NSArray *episodesArray = dramaDict[@"episodes"];
         NSMutableArray *episodes = [NSMutableArray array];
@@ -290,7 +291,7 @@
 #pragma mark - 筛选逻辑
 
 - (void)filterEpisodesByRange:(NSInteger)range {
-    NSInteger all = self.drama.totalEpisodes; //100
+    NSInteger all = self.drama.totalEpisodes == 0 ? 95 :self.drama.totalEpisodes;
     if (all == 0) {
         return;
     }
@@ -337,14 +338,16 @@
     if (collectionView == self.collectionViewNav) {
         return  self.navArray.count;
     }
-    return self.filteredEpisodes.count;
+    return self.navArray.count ? 20 : 0; //写死的,后面要改
+//    return self.filteredEpisodes.count ;
 }
 
 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
     
-    videoItemsNavCell *cell1 = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass(videoItemsNavCell.class) forIndexPath:indexPath];
+   
     
     if (collectionView == self.collectionViewNav) {
+        videoItemsNavCell *cell1 = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass(videoItemsNavCell.class) forIndexPath:indexPath];
         cell1.layer.cornerRadius = 5;
         if (self.selectedRange == indexPath.row) {
             cell1.backgroundColor = [UIColor colorWithRed:255/255.0 green:240/255.0 blue:234/255.0 alpha:1];
@@ -368,7 +371,7 @@
     
     videoItemsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass(videoItemsCell.class) forIndexPath:indexPath];
     
-    JXEpisodeInfo *episode = self.filteredEpisodes[indexPath.item];
+//    JXEpisodeInfo *episode = self.filteredEpisodes[indexPath.item];
     
     // 临时简单展示(后续可创建自定义Cell)
 //    cell.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
@@ -445,15 +448,26 @@
         [self.collectionView reloadData];
         return ;
     }
-    JXEpisodeInfo *episode = self.filteredEpisodes[indexPath.item];
-    
-    NSLog(@"[JXCollection] 选择剧集: %ld", (long)episode.episodeNumber);
-    
-    if ([self.delegate respondsToSelector:@selector(collectionViewControllerDidSelectEpisode:)]) {
-        [self.delegate collectionViewControllerDidSelectEpisode:episode.episodeId];
+    if (self.filteredEpisodes.count > 0 &&  (self.filteredEpisodes.count >= indexPath.item)) {
+        JXEpisodeInfo *episode = self.filteredEpisodes[indexPath.item];
+        
+        NSLog(@"[JXCollection] 选择剧集: %ld", (long)episode.episodeNumber);
+        
+        if ([self.delegate respondsToSelector:@selector(collectionViewControllerDidSelectEpisode:)]) {
+            [self.delegate collectionViewControllerDidSelectEpisode:episode.episodeId];
+        }
+        
+        [self dismissViewControllerAnimated:YES completion:nil];
+    }else{
+        //测试一下
+        
+        if ([self.delegate respondsToSelector:@selector(collectionViewControllerDidSelectEpisode:)]) {
+            [self.delegate collectionViewControllerDidSelectEpisode:@"1"];
+        }
+        
+        [self dismissViewControllerAnimated:YES completion:nil];
     }
     
-    [self dismissViewControllerAnimated:YES completion:nil];
 }
 
 - (NSMutableArray *)navArray{

+ 77 - 80
AICityProperty/AICity/JuXing/Views/JXCommentViewController.m

@@ -8,7 +8,8 @@
 #import "JXCommentViewController.h"
 #import "JXAPIService.h"
 #import "JXCommentContent.h"
-
+#import "CommentItemCell.h"
+#import "CommentRpItemCell.h"
 // Cell复用标识符
 static NSString * const kCommentCellIdentifier = @"JXCommentCell";
 
@@ -100,14 +101,14 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
     
     // 标题
     self.titleLabel = [[UILabel alloc] init];
-    self.titleLabel.text = @"评论";
-    self.titleLabel.font = [UIFont boldSystemFontOfSize:18];
-    self.titleLabel.textColor = [UIColor blackColor];
+    self.titleLabel.text = @"全部评论";
+    self.titleLabel.font = [UIFont boldSystemFontOfSize:15];
+    self.titleLabel.textColor = [UIColor colorWithRed:1/255.0 green:1/255.0 blue:1/255.0 alpha:1];
     [self.headerView addSubview:self.titleLabel];
     
     // 关闭按钮
     self.closeButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    [self.closeButton setImage:[UIImage systemImageNamed:@"xmark"] forState:UIControlStateNormal];
+    [self.closeButton setImage:[UIImage imageNamed:@"关闭-1"] forState:UIControlStateNormal];
     self.closeButton.tintColor = [UIColor grayColor];
     [self.closeButton addTarget:self action:@selector(handleClose) forControlEvents:UIControlEventTouchUpInside];
     [self.headerView addSubview:self.closeButton];
@@ -121,15 +122,17 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
         [self.headerView.topAnchor constraintEqualToAnchor:self.view.topAnchor],
         [self.headerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
         [self.headerView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
-        [self.headerView.heightAnchor constraintEqualToConstant:60],
+        [self.headerView.heightAnchor constraintEqualToConstant:50],
         
-        [self.titleLabel.centerXAnchor constraintEqualToAnchor:self.headerView.centerXAnchor],
         [self.titleLabel.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
+        [self.titleLabel.leadingAnchor constraintEqualToAnchor:self.headerView.leadingAnchor constant:16],
+        [self.titleLabel.heightAnchor constraintEqualToConstant:50],
+        [self.titleLabel.widthAnchor constraintEqualToConstant:200],
         
-        [self.closeButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-16],
+        [self.closeButton.trailingAnchor constraintEqualToAnchor:self.headerView.trailingAnchor constant:-8],
         [self.closeButton.centerYAnchor constraintEqualToAnchor:self.headerView.centerYAnchor],
-        [self.closeButton.widthAnchor constraintEqualToConstant:30],
-        [self.closeButton.heightAnchor constraintEqualToConstant:30]
+        [self.closeButton.widthAnchor constraintEqualToConstant:50],
+        [self.closeButton.heightAnchor constraintEqualToConstant:50]
     ]];
 }
 
@@ -139,7 +142,8 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
     self.tableView.dataSource = self;
     self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
     self.tableView.backgroundColor = [UIColor whiteColor];
-    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kCommentCellIdentifier];
+    [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass(CommentItemCell.class) bundle:nil] forCellReuseIdentifier:NSStringFromClass(CommentItemCell.class)];
+    [self.tableView registerNib:[UINib nibWithNibName:NSStringFromClass(CommentRpItemCell.class) bundle:nil] forCellReuseIdentifier:NSStringFromClass(CommentRpItemCell.class)];
     [self.view addSubview:self.tableView];
     
     // 下拉刷新
@@ -153,59 +157,40 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
         [self.tableView.topAnchor constraintEqualToAnchor:self.headerView.bottomAnchor],
         [self.tableView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
         [self.tableView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
-        [self.tableView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-60]
+        [self.tableView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-70]
     ]];
 }
 
 - (void)setupInputContainer {
     self.inputContainerView = [[UIView alloc] init];
-    self.inputContainerView.backgroundColor = [UIColor colorWithWhite:0.95 alpha:1.0];
+    self.inputContainerView.backgroundColor = UIColor.whiteColor;
     [self.view addSubview:self.inputContainerView];
     
     // 输入框
     self.inputTextField = [[UITextField alloc] init];
     self.inputTextField.placeholder = @"说点什么...";
-    self.inputTextField.backgroundColor = [UIColor whiteColor];
+    self.inputTextField.backgroundColor = RGBACOLOR(241, 242, 244, 1);
     self.inputTextField.layer.cornerRadius = 20;
-    self.inputTextField.layer.borderWidth = 1.0;
-    self.inputTextField.layer.borderColor = [UIColor lightGrayColor].CGColor;
     self.inputTextField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 12, 0)];
     self.inputTextField.leftViewMode = UITextFieldViewModeAlways;
     self.inputTextField.delegate = self;
     [self.inputTextField addTarget:self action:@selector(textFieldDidChange) forControlEvents:UIControlEventEditingChanged];
     [self.inputContainerView addSubview:self.inputTextField];
     
-    // 提交按钮
-    self.submitButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    [self.submitButton setTitle:@"发送" forState:UIControlStateNormal];
-    [self.submitButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
-    [self.submitButton setTitleColor:[UIColor lightGrayColor] forState:UIControlStateDisabled];
-    self.submitButton.backgroundColor = [UIColor systemBlueColor];
-    self.submitButton.layer.cornerRadius = 20;
-    self.submitButton.enabled = NO;
-    [self.submitButton addTarget:self action:@selector(handleSubmit) forControlEvents:UIControlEventTouchUpInside];
-    [self.inputContainerView addSubview:self.submitButton];
-    
     // 约束
     self.inputContainerView.translatesAutoresizingMaskIntoConstraints = NO;
     self.inputTextField.translatesAutoresizingMaskIntoConstraints = NO;
-    self.submitButton.translatesAutoresizingMaskIntoConstraints = NO;
     
     [NSLayoutConstraint activateConstraints:@[
         [self.inputContainerView.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor],
         [self.inputContainerView.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor],
-        [self.inputContainerView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor],
-        [self.inputContainerView.heightAnchor constraintEqualToConstant:60],
+        [self.inputContainerView.bottomAnchor constraintEqualToAnchor:self.view.bottomAnchor constant:-safebottom],
+        [self.inputContainerView.heightAnchor constraintEqualToConstant:50],
         
-        [self.inputTextField.leadingAnchor constraintEqualToAnchor:self.inputContainerView.leadingAnchor constant:12],
+        [self.inputTextField.leadingAnchor constraintEqualToAnchor:self.inputContainerView.leadingAnchor constant:16],
+        [self.inputTextField.rightAnchor constraintEqualToAnchor:self.inputContainerView.rightAnchor constant:-16],
         [self.inputTextField.centerYAnchor constraintEqualToAnchor:self.inputContainerView.centerYAnchor],
         [self.inputTextField.heightAnchor constraintEqualToConstant:40],
-        
-        [self.submitButton.leadingAnchor constraintEqualToAnchor:self.inputTextField.trailingAnchor constant:8],
-        [self.submitButton.trailingAnchor constraintEqualToAnchor:self.inputContainerView.trailingAnchor constant:-12],
-        [self.submitButton.centerYAnchor constraintEqualToAnchor:self.inputContainerView.centerYAnchor],
-        [self.submitButton.widthAnchor constraintEqualToConstant:60],
-        [self.submitButton.heightAnchor constraintEqualToConstant:40]
     ]];
 }
 
@@ -230,7 +215,7 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
         long long totalCount = [data[@"total"] longLongValue];
         
         // 更新标题
-        self.titleLabel.text = [NSString stringWithFormat:@"%lld条评论", totalCount];
+        self.titleLabel.text = [NSString stringWithFormat:@"全部评论"];
         
         if (list.count == 0) {
             self.hasMoreData = NO;
@@ -275,26 +260,35 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
 }
 
 #pragma mark - UITableViewDataSource
-
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
+    return  5;
+}
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
-    return self.commentList.count;
+//    return self.commentList.count;
+    return 3;
 }
 
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
-    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCommentCellIdentifier forIndexPath:indexPath];
-    
-    JXCommentContent *comment = self.commentList[indexPath.row];
+    if (indexPath.row == 0) {
+        CommentItemCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(CommentItemCell.class) forIndexPath:indexPath];
+        cell.selectionStyle = UITableViewCellSelectionStyleNone;
+        return cell;
+    }
+    CommentRpItemCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(CommentRpItemCell.class) forIndexPath:indexPath];
+    cell.selectionStyle = UITableViewCellSelectionStyleNone;
     
-    // 临时简单展示(后续可创建自定义Cell)
-    cell.textLabel.numberOfLines = 0;
-    NSString *likeText = comment.isLiked ? @"❤️" : @"🤍";
-    cell.textLabel.text = [NSString stringWithFormat:@"%@ · %@\n%@\n%@ %lld  💬 %lld",
-                          comment.userName,
-                          [comment formattedTime],
-                          comment.content,
-                          likeText,
-                          comment.likeCount,
-                          comment.replyCount];
+//    JXCommentContent *comment = self.commentList[indexPath.row];
+//    
+//    // 临时简单展示(后续可创建自定义Cell)
+//    cell.textLabel.numberOfLines = 0;
+//    NSString *likeText = comment.isLiked ? @"❤️" : @"🤍";
+//    cell.textLabel.text = [NSString stringWithFormat:@"%@ · %@\n%@\n%@ %lld  💬 %lld",
+//                          comment.userName,
+//                          [comment formattedTime],
+//                          comment.content,
+//                          likeText,
+//                          comment.likeCount,
+//                          comment.replyCount];
     
     return cell;
 }
@@ -310,33 +304,36 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
 }
 
 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
-    [tableView deselectRowAtIndexPath:indexPath animated:YES];
-    
-    JXCommentContent *comment = self.commentList[indexPath.row];
-    
-    // 显示操作菜单(点赞、回复)
-    UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil
-                                                                   message:nil
-                                                            preferredStyle:UIAlertControllerStyleActionSheet];
+//    [tableView deselectRowAtIndexPath:indexPath animated:YES];
     
-    // 点赞
-    NSString *likeTitle = comment.isLiked ? @"取消点赞" : @"点赞";
-    [alert addAction:[UIAlertAction actionWithTitle:likeTitle
-                                              style:UIAlertActionStyleDefault
-                                            handler:^(UIAlertAction *action) {
-        [self handleLikeComment:comment];
-    }]];
-    
-    // 回复
-    [alert addAction:[UIAlertAction actionWithTitle:@"回复"
-                                              style:UIAlertActionStyleDefault
-                                            handler:^(UIAlertAction *action) {
-        [self handleReplyComment:comment];
-    }]];
-    
-    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
-    
-    [self presentViewController:alert animated:YES completion:nil];
+    return;
+    if (indexPath.row == 0) {
+        JXCommentContent *comment = self.commentList[indexPath.row];
+        
+        // 显示操作菜单(点赞、回复)
+        UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil
+                                                                       message:nil
+                                                                preferredStyle:UIAlertControllerStyleActionSheet];
+        
+        // 点赞
+        NSString *likeTitle = comment.isLiked ? @"取消点赞" : @"点赞";
+        [alert addAction:[UIAlertAction actionWithTitle:likeTitle
+                                                  style:UIAlertActionStyleDefault
+                                                handler:^(UIAlertAction *action) {
+            [self handleLikeComment:comment];
+        }]];
+        
+        // 回复
+        [alert addAction:[UIAlertAction actionWithTitle:@"回复"
+                                                  style:UIAlertActionStyleDefault
+                                                handler:^(UIAlertAction *action) {
+            [self handleReplyComment:comment];
+        }]];
+        
+        [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil]];
+        
+        [self presentViewController:alert animated:YES completion:nil];
+    }
 }
 
 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
@@ -346,7 +343,7 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
     CGFloat scrollViewHeight = scrollView.bounds.size.height;
     
     if (offsetY + scrollViewHeight >= contentHeight - 200) {
-        [self loadMoreComments];
+//        [self loadMoreComments];
     }
 }
 

+ 62 - 147
AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m

@@ -31,7 +31,6 @@
 @property (nonatomic, strong) UIView *bottomInfoView;
 @property (nonatomic, strong) UILabel *titleLabel;
 @property (nonatomic, strong) UILabel *descriptionLabel;
-@property (nonatomic, strong) UIButton *detailButton;
 
 #pragma mark - 数据
 @property (nonatomic, strong) JXDramaContent *drama;
@@ -115,14 +114,6 @@
 }
 
 - (void)setupInteractionButtons {
-    // 创建垂直StackView
-    self.interactionStackView = [[UIStackView alloc] init];
-    self.interactionStackView.axis = UILayoutConstraintAxisVertical;
-    self.interactionStackView.spacing = 24;
-    self.interactionStackView.alignment = UIStackViewAlignmentCenter;
-    self.interactionStackView.backgroundColor = UIColor.redColor;
-    [self.contentView addSubview:self.interactionStackView];
-    
     // 点赞按钮
     [self addLikeButton];
     
@@ -134,140 +125,82 @@
     
     // 合集按钮
     [self addCollectionButton];
-    
-    // 约束
-    self.interactionStackView.translatesAutoresizingMaskIntoConstraints = NO;
-    [NSLayoutConstraint activateConstraints:@[
-        [self.interactionStackView.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor constant:-16],
-        [self.interactionStackView.bottomAnchor constraintEqualToAnchor:self.contentView.safeAreaLayoutGuide.bottomAnchor constant:-60]
-    ]];
 }
 
 - (void)addLikeButton {
-    UIView *likeContainer = [[UIView alloc] init];
-    
-    self.likeButton = [UIButton buttonWithType:UIButtonTypeCustom];
-    [self.likeButton setImage:[UIImage systemImageNamed:@"heart"] forState:UIControlStateNormal];
-    [self.likeButton setImage:[UIImage systemImageNamed:@"heart.fill"] forState:UIControlStateSelected];
+   
+    UIView *likeContainer = [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width-48, self.frame.size.height-BAR_HEIGHT - 100 - 130, 32, 50)];
+    self.likeButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
+    [self.likeButton setImage:[UIImage imageNamed:@"icon 1.1"] forState:UIControlStateNormal];
+    [self.likeButton setImage:[UIImage imageNamed:@"icon 1.5"] forState:UIControlStateSelected];
     self.likeButton.tintColor = [UIColor whiteColor];
     [self.likeButton addTarget:self action:@selector(handleLikeTap) forControlEvents:UIControlEventTouchUpInside];
     [likeContainer addSubview:self.likeButton];
-    
-    self.likeCountLabel = [[UILabel alloc] init];
+    self.likeCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 32, 32, 18)];
     self.likeCountLabel.textColor = [UIColor whiteColor];
     self.likeCountLabel.font = [UIFont systemFontOfSize:12];
     self.likeCountLabel.textAlignment = NSTextAlignmentCenter;
     self.likeCountLabel.text = @"0";
     [likeContainer addSubview:self.likeCountLabel];
-    
-    // 约束
-    self.likeButton.translatesAutoresizingMaskIntoConstraints = NO;
-    self.likeCountLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    [NSLayoutConstraint activateConstraints:@[
-        [self.likeButton.topAnchor constraintEqualToAnchor:likeContainer.topAnchor],
-        [self.likeButton.centerXAnchor constraintEqualToAnchor:likeContainer.centerXAnchor],
-        [self.likeButton.widthAnchor constraintEqualToConstant:40],
-        [self.likeButton.heightAnchor constraintEqualToConstant:40],
-        
-        [self.likeCountLabel.topAnchor constraintEqualToAnchor:self.likeButton.bottomAnchor constant:4],
-        [self.likeCountLabel.centerXAnchor constraintEqualToAnchor:likeContainer.centerXAnchor],
-        [self.likeCountLabel.bottomAnchor constraintEqualToAnchor:likeContainer.bottomAnchor]
-    ]];
-    
-    [self.interactionStackView addArrangedSubview:likeContainer];
+    [self.contentView addSubview:likeContainer];
 }
 
 - (void)addFavoriteButton {
-    UIView *favoriteContainer = [[UIView alloc] init];
-    
-    self.favoriteButton = [UIButton buttonWithType:UIButtonTypeCustom];
-    [self.favoriteButton setImage:[UIImage systemImageNamed:@"star"] forState:UIControlStateNormal];
-    [self.favoriteButton setImage:[UIImage systemImageNamed:@"star.fill"] forState:UIControlStateSelected];
+   
+    UIView *favoriteContainer = [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width-48, self.frame.size.height-BAR_HEIGHT - 100 - 65, 32, 50)];
+    self.favoriteButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
+    [self.favoriteButton setImage:[UIImage imageNamed:@"icon 1.2"] forState:UIControlStateNormal];
+    [self.favoriteButton setImage:[UIImage imageNamed:@"icon 1.5"] forState:UIControlStateSelected];
     self.favoriteButton.tintColor = [UIColor whiteColor];
     [self.favoriteButton addTarget:self action:@selector(handleFavoriteTap) forControlEvents:UIControlEventTouchUpInside];
     [favoriteContainer addSubview:self.favoriteButton];
-    
-    self.favoriteCountLabel = [[UILabel alloc] init];
+    self.favoriteCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 32, 32, 18)];
     self.favoriteCountLabel.textColor = [UIColor whiteColor];
     self.favoriteCountLabel.font = [UIFont systemFontOfSize:12];
     self.favoriteCountLabel.textAlignment = NSTextAlignmentCenter;
     self.favoriteCountLabel.text = @"0";
     [favoriteContainer addSubview:self.favoriteCountLabel];
-    
-    // 约束
-    self.favoriteButton.translatesAutoresizingMaskIntoConstraints = NO;
-    self.favoriteCountLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    [NSLayoutConstraint activateConstraints:@[
-        [self.favoriteButton.topAnchor constraintEqualToAnchor:favoriteContainer.topAnchor],
-        [self.favoriteButton.centerXAnchor constraintEqualToAnchor:favoriteContainer.centerXAnchor],
-        [self.favoriteButton.widthAnchor constraintEqualToConstant:40],
-        [self.favoriteButton.heightAnchor constraintEqualToConstant:40],
-        
-        [self.favoriteCountLabel.topAnchor constraintEqualToAnchor:self.favoriteButton.bottomAnchor constant:4],
-        [self.favoriteCountLabel.centerXAnchor constraintEqualToAnchor:favoriteContainer.centerXAnchor],
-        [self.favoriteCountLabel.bottomAnchor constraintEqualToAnchor:favoriteContainer.bottomAnchor]
-    ]];
-    
-    [self.interactionStackView addArrangedSubview:favoriteContainer];
+    [self.contentView addSubview:favoriteContainer];
 }
 
 - (void)addCommentButton {
-    UIView *commentContainer = [[UIView alloc] init];
-    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleCommentTap2)];
-    [commentContainer addGestureRecognizer:tap];
-    commentContainer.backgroundColor = UIColor.yellowColor;
-    self.commentButton = [UIButton buttonWithType:UIButtonTypeCustom];
-    [self.commentButton setImage:[UIImage systemImageNamed:@"bubble.right"] forState:UIControlStateNormal];
+    UIView *commentContainer = [[UIView alloc] initWithFrame:CGRectMake(self.frame.size.width-48, self.frame.size.height-BAR_HEIGHT - 100, 32, 50)];
+    self.commentButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 32, 32)];
+    [self.commentButton setImage:[UIImage imageNamed:@"icon 1.3"] forState:UIControlStateNormal];
     self.commentButton.tintColor = [UIColor whiteColor];
-//    [self.commentButton addTarget:self action:@selector(handleCommentTap) forControlEvents:UIControlEventTouchUpInside];
-    self.commentButton.backgroundColor = UIColor.blackColor;
-    self.commentButton.userInteractionEnabled = NO;
-//    commentContainer.userInteractionEnabled = YES;
+    [self.commentButton addTarget:self action:@selector(handleCommentTap) forControlEvents:UIControlEventTouchUpInside];
     [commentContainer addSubview:self.commentButton];
-
-    self.commentCountLabel = [[UILabel alloc] init];
+    self.commentCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 32, 32, 18)];
     self.commentCountLabel.textColor = [UIColor whiteColor];
     self.commentCountLabel.font = [UIFont systemFontOfSize:12];
     self.commentCountLabel.textAlignment = NSTextAlignmentCenter;
     self.commentCountLabel.text = @"0";
     [commentContainer addSubview:self.commentCountLabel];
-    
-    // 约束
-    self.commentButton.translatesAutoresizingMaskIntoConstraints = NO;
-    self.commentCountLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    [NSLayoutConstraint activateConstraints:@[
-        [self.commentButton.topAnchor constraintEqualToAnchor:commentContainer.topAnchor],
-        [self.commentButton.centerXAnchor constraintEqualToAnchor:commentContainer.centerXAnchor],
-        [self.commentButton.widthAnchor constraintEqualToConstant:40],
-        [self.commentButton.heightAnchor constraintEqualToConstant:40],
-        
-        [self.commentCountLabel.topAnchor constraintEqualToAnchor:self.commentButton.bottomAnchor constant:4],
-        [self.commentCountLabel.centerXAnchor constraintEqualToAnchor:commentContainer.centerXAnchor],
-        [self.commentCountLabel.bottomAnchor constraintEqualToAnchor:commentContainer.bottomAnchor]
-    ]];
-    
-    [self.interactionStackView addArrangedSubview:commentContainer];
+    [self.contentView addSubview:commentContainer];
 }
 
 - (void)addCollectionButton {
-    self.collectionButton = [UIButton buttonWithType:UIButtonTypeCustom];
-    [self.collectionButton setImage:[UIImage systemImageNamed:@"square.grid.2x2"] forState:UIControlStateNormal];
-    self.collectionButton.tintColor = [UIColor whiteColor];
-    [self.collectionButton addTarget:self action:@selector(handleCollectionTap) forControlEvents:UIControlEventTouchUpInside];
-    
-    // 约束
-    self.collectionButton.translatesAutoresizingMaskIntoConstraints = NO;
-    [NSLayoutConstraint activateConstraints:@[
-        [self.collectionButton.widthAnchor constraintEqualToConstant:40],
-        [self.collectionButton.heightAnchor constraintEqualToConstant:40]
-    ]];
+    UIView *bottomView = [[UIView alloc] initWithFrame:CGRectMake(0, self.frame.size.height - 38 - BAR_HEIGHT, SCREEN_WIDTH, 38)];
+    bottomView.backgroundColor = [UIColor colorWithRed:255/255.0 green:255/255.0 blue:255/255.0 alpha:0.1];
+    [self.contentView addSubview:bottomView];
+    UIImageView *sImgView = [[UIImageView alloc] initWithFrame:CGRectMake(16, 10.5, 17, 17)];
+    sImgView.image = [UIImage imageNamed:@"icon 2.1 拷贝"];
+    [bottomView addSubview:sImgView];
+    UILabel *hjL = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetMaxX(sImgView.frame)+4, 0, 100, 38)];
+    [bottomView addSubview:hjL];
+    hjL.font = [UIFont boldSystemFontOfSize:18];
+    hjL.textColor = UIColor.whiteColor;
+    hjL.text = @"合集";
+    UIImageView *mImgView = [[UIImageView alloc] initWithFrame:CGRectMake(SCREEN_WIDTH-27, 13.5, 11, 11)];
+    mImgView.image = [UIImage imageNamed:@"Frame 9366"];
+    [bottomView addSubview:mImgView];
+    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleCollectionTap)];
+    [bottomView addGestureRecognizer:tap];
     
-    [self.interactionStackView addArrangedSubview:self.collectionButton];
 }
 
 - (void)setupBottomInfo {
     self.bottomInfoView = [[UIView alloc] init];
-    self.bottomInfoView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.3];
     [self.contentView addSubview:self.bottomInfoView];
     
     // 标题
@@ -279,29 +212,20 @@
     
     // 描述
     self.descriptionLabel = [[UILabel alloc] init];
-    self.descriptionLabel.textColor = [UIColor colorWithWhite:1.0 alpha:0.8];
-    self.descriptionLabel.font = [UIFont systemFontOfSize:14];
+    self.descriptionLabel.textColor = [UIColor colorWithWhite:1.0 alpha:1];
+    self.descriptionLabel.font = [UIFont systemFontOfSize:15];
     self.descriptionLabel.numberOfLines = 2;
     [self.bottomInfoView addSubview:self.descriptionLabel];
     
-    // 详情按钮
-    self.detailButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    [self.detailButton setTitle:@"查看全部" forState:UIControlStateNormal];
-    [self.detailButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
-    self.detailButton.titleLabel.font = [UIFont systemFontOfSize:12];
-    [self.detailButton addTarget:self action:@selector(handleDetailTap) forControlEvents:UIControlEventTouchUpInside];
-    [self.bottomInfoView addSubview:self.detailButton];
-    
     // 约束
     self.bottomInfoView.translatesAutoresizingMaskIntoConstraints = NO;
     self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
     self.descriptionLabel.translatesAutoresizingMaskIntoConstraints = NO;
-    self.detailButton.translatesAutoresizingMaskIntoConstraints = NO;
     
     [NSLayoutConstraint activateConstraints:@[
         [self.bottomInfoView.leadingAnchor constraintEqualToAnchor:self.contentView.leadingAnchor],
-        [self.bottomInfoView.trailingAnchor constraintEqualToAnchor:self.interactionStackView.leadingAnchor constant:-16],
-        [self.bottomInfoView.bottomAnchor constraintEqualToAnchor:self.contentView.safeAreaLayoutGuide.bottomAnchor constant:-120],
+        [self.bottomInfoView.trailingAnchor constraintEqualToAnchor:self.contentView.trailingAnchor constant:-90],
+        [self.bottomInfoView.bottomAnchor constraintEqualToAnchor:self.contentView.safeAreaLayoutGuide.bottomAnchor constant:-(BAR_HEIGHT+54)],
         [self.bottomInfoView.heightAnchor constraintGreaterThanOrEqualToConstant:80],
         
         [self.titleLabel.topAnchor constraintEqualToAnchor:self.bottomInfoView.topAnchor constant:12],
@@ -312,9 +236,6 @@
         [self.descriptionLabel.leadingAnchor constraintEqualToAnchor:self.bottomInfoView.leadingAnchor constant:16],
         [self.descriptionLabel.trailingAnchor constraintEqualToAnchor:self.bottomInfoView.trailingAnchor constant:-16],
         
-        [self.detailButton.topAnchor constraintEqualToAnchor:self.descriptionLabel.bottomAnchor constant:8],
-        [self.detailButton.leadingAnchor constraintEqualToAnchor:self.bottomInfoView.leadingAnchor constant:16],
-        [self.detailButton.bottomAnchor constraintEqualToAnchor:self.bottomInfoView.bottomAnchor constant:-12]
     ]];
 }
 
@@ -494,37 +415,31 @@
         NSLog(@"[JXShortDramaCell] ⚠️ delegate 不响应 shortDramaCellDidTapFavorite");
     }
 }
-- (void)handleCommentTap2{
-    
-}
+
 - (void)handleCommentTap {
     
-    if ([self.delegate respondsToSelector:@selector(shortDramaCellDidTapComment:)]) {
-        [self.delegate shortDramaCellDidTapComment:self];
-    }
+    NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - 评论按钮被点击!");
+    NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate: %@", self.delegate);
+    NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate class: %@", [self.delegate class]);
     
-//    NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - 评论按钮被点击!");
-//    NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate: %@", self.delegate);
-//    NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate class: %@", [self.delegate class]);
-//    
-//    if (self.delegate) {
-//        NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate 存在");
-//        
-//        SEL selector = @selector(shortDramaCellDidTapComment:);
-//        BOOL responds = [self.delegate respondsToSelector:selector];
-//        NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate 响应 shortDramaCellDidTapComment: %@", 
-//              responds ? @"YES ✅" : @"NO ❌");
-//        
-//        if (responds) {
-//            NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - 调用 delegate 方法");
-//            [self.delegate shortDramaCellDidTapComment:self];
-//            NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate 方法已调用");
-//        } else {
-//            NSLog(@"[JXShortDramaCell] ❌ handleCommentTap - delegate 不响应该方法");
-//        }
-//    } else {
-//        NSLog(@"[JXShortDramaCell] ❌ handleCommentTap - delegate 为 nil");
-//    }
+    if (self.delegate) {
+        NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate 存在");
+        
+        SEL selector = @selector(shortDramaCellDidTapComment:);
+        BOOL responds = [self.delegate respondsToSelector:selector];
+        NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate 响应 shortDramaCellDidTapComment: %@", 
+              responds ? @"YES ✅" : @"NO ❌");
+        
+        if (responds) {
+            NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - 调用 delegate 方法");
+            [self.delegate shortDramaCellDidTapComment:self];
+            NSLog(@"[JXShortDramaCell] 💬 handleCommentTap - delegate 方法已调用");
+        } else {
+            NSLog(@"[JXShortDramaCell] ❌ handleCommentTap - delegate 不响应该方法");
+        }
+    } else {
+        NSLog(@"[JXShortDramaCell] ❌ handleCommentTap - delegate 为 nil");
+    }
 }
 
 - (void)handleCollectionTap {

+ 2 - 2
AICityProperty/AICity/Utils/GuestHelper.m

@@ -25,7 +25,7 @@
     // 检查登录状态
     UserModel *user = [UserModel shareInstance];
     
-    if (user.isLogin && user.token.length > 0) {
+    if (user.token.length > 0) {
         // 已登录,直接执行操作
         NSLog(@"[GuestHelper] User is logged in, executing action");
         if (action) {
@@ -42,7 +42,7 @@
 
 - (BOOL)isLoggedIn {
     UserModel *user = [UserModel shareInstance];
-    return user.isLogin && user.token.length > 0;
+    return  user.token.length > 0;
 }
 
 - (void)showLoginAlertWithViewController:(UIViewController *)viewController

+ 3 - 3
AICityProperty/AICity/viewControlls/CTTabbarController.m

@@ -133,10 +133,10 @@ static CTTabbarController *tabbarController = nil;
 {
     if (_arrTabImage == nil) {
         _arrTabImage = [NSArray arrayWithObjects:
-                        @{@"n":@"Frame 7",@"s":@"Frame 2",@"t":@"首页"},
-                        @{@"n":@"Frame 3",@"s":@"Frame 8",@"t":@"短剧"},
+                        @{@"n":@"icon-2.1",@"s":@"icon-1.1",@"t":@"首页"},
+                        @{@"n":@"icon-2.2",@"s":@"icon-1.2",@"t":@"短剧"},
                         // @{@"n":@"Frame 3",@"s":@"Frame 8",@"t":@"搜索"},  // 暂时注释
-                        @{@"n":@"Frame 5",@"s":@"Frame 9",@"t":@"我的"},
+                        @{@"n":@"icon-2.4",@"s":@"icon-1.4",@"t":@"我的"},
                         nil];
     }
     return _arrTabImage;

+ 1 - 0
AICityProperty/Podfile

@@ -14,6 +14,7 @@ target 'AICity' do
   pod 'ZFPlayer/ijkplayer', '4.1.4'
   pod 'FDFullscreenPopGesture'
   pod 'MBProgressHUD'
+  pod 'MJExtension'
   # pod 'WechatOpenSDK'  # 暂时注释,模拟器不支持
   # pod 'AlipaySDK-iOS', '15.8.17'  # 暂时注释,版本不兼容
   

+ 5 - 1
AICityProperty/Podfile.lock

@@ -18,6 +18,7 @@ PODS:
   - IJKMediaFramework (0.1.5)
   - Masonry (1.1.0)
   - MBProgressHUD (1.2.0)
+  - MJExtension (3.4.1)
   - MJRefresh (3.7.5)
   - SDWebImage (5.12.1):
     - SDWebImage/Core (= 5.12.1)
@@ -39,6 +40,7 @@ DEPENDENCIES:
   - FDFullscreenPopGesture
   - Masonry
   - MBProgressHUD
+  - MJExtension
   - MJRefresh (= 3.7.5)
   - SDWebImage (= 5.12.1)
   - TXLiteAVSDK_Player (~> 11.8)
@@ -54,6 +56,7 @@ SPEC REPOS:
     - IJKMediaFramework
     - Masonry
     - MBProgressHUD
+    - MJExtension
     - MJRefresh
     - SDWebImage
     - TXLiteAVSDK_Player
@@ -65,11 +68,12 @@ SPEC CHECKSUMS:
   IJKMediaFramework: f1119f6324c96bc4654f3045a5beaa95ba0596c0
   Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
   MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
+  MJExtension: 21c5f6f8c4d5d8844b7ae8fbae08fed0b501f961
   MJRefresh: fdf5e979eb406a0341468932d1dfc8b7f9fce961
   SDWebImage: 4dc3e42d9ec0c1028b960a33ac6b637bb432207b
   TXLiteAVSDK_Player: 8bdcac2a4e713f9d3e60ca618c1a03fcf2ce629c
   ZFPlayer: 5cf39e8d9f0c2394a014b0db4767b5b5a6bffe13
 
-PODFILE CHECKSUM: 8d77bbc7a51b1b265ca5b8d0f4e222776baab476
+PODFILE CHECKSUM: 9a72507eb5ea95b8272845fec9f56f1a45f36508
 
 COCOAPODS: 1.16.2

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/MJExtension.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJExtension.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/MJExtensionConst.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJExtensionConst.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/MJFoundation.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJFoundation.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/MJProperty.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJProperty.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/MJPropertyKey.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJPropertyKey.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/MJPropertyType.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJPropertyType.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJClass.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJClass.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJCoding.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJCoding.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJKeyValue.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJKeyValue.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/NSObject+MJProperty.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJProperty.h

+ 1 - 0
AICityProperty/Pods/Headers/Private/MJExtension/NSString+MJExtension.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSString+MJExtension.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/MJExtension.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJExtension.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/MJExtensionConst.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJExtensionConst.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/MJFoundation.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJFoundation.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/MJProperty.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJProperty.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/MJPropertyKey.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJPropertyKey.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/MJPropertyType.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/MJPropertyType.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJClass.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJClass.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJCoding.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJCoding.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJKeyValue.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJKeyValue.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/NSObject+MJProperty.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSObject+MJProperty.h

+ 1 - 0
AICityProperty/Pods/Headers/Public/MJExtension/NSString+MJExtension.h

@@ -0,0 +1 @@
+../../../MJExtension/MJExtension/NSString+MJExtension.h

+ 19 - 0
AICityProperty/Pods/MJExtension/LICENSE

@@ -0,0 +1,19 @@
+Copyright (c) 2013-2019 MJExtension (https://github.com/CoderMJLee/MJExtension)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.

+ 27 - 0
AICityProperty/Pods/MJExtension/MJExtension/MJExtension.h

@@ -0,0 +1,27 @@
+//
+//  MJExtension.h
+//  MJExtension
+//
+//  Created by mj on 14-1-15.
+//  Copyright (c) 2014年 小码哥. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+#import "NSObject+MJCoding.h"
+#import "NSObject+MJProperty.h"
+#import "NSObject+MJClass.h"
+#import "NSObject+MJKeyValue.h"
+#import "NSString+MJExtension.h"
+#import "MJExtensionConst.h"
+
+#import "MJFoundation.h"
+
+//! Project version number for MJExtension.
+FOUNDATION_EXPORT double MJExtensionVersionNumber;
+
+//! Project version string for MJExtension.
+FOUNDATION_EXPORT const unsigned char MJExtensionVersionString[];
+
+// In this header, you should import all the public headers of your framework using statements like #import <MJExtension/PublicHeader.h>
+
+

+ 111 - 0
AICityProperty/Pods/MJExtension/MJExtension/MJExtensionConst.h

@@ -0,0 +1,111 @@
+
+#ifndef __MJExtensionConst__H__
+#define __MJExtensionConst__H__
+
+#import <Foundation/Foundation.h>
+
+#ifndef MJ_LOCK
+#define MJ_LOCK(lock) dispatch_semaphore_wait(lock, DISPATCH_TIME_FOREVER);
+#endif
+
+#ifndef MJ_UNLOCK
+#define MJ_UNLOCK(lock) dispatch_semaphore_signal(lock);
+#endif
+
+// 信号量
+#define MJExtensionSemaphoreCreate \
+extern dispatch_semaphore_t mje_signalSemaphore; \
+extern dispatch_once_t mje_onceTokenSemaphore; \
+dispatch_once(&mje_onceTokenSemaphore, ^{ \
+    mje_signalSemaphore = dispatch_semaphore_create(1); \
+});
+
+// 过期
+#define MJExtensionDeprecated(instead) NS_DEPRECATED(2_0, 2_0, 2_0, 2_0, instead)
+
+// 构建错误
+#define MJExtensionBuildError(clazz, msg) \
+NSError *error = [NSError errorWithDomain:msg code:250 userInfo:nil]; \
+[clazz setMj_error:error];
+
+// 日志输出
+#ifdef DEBUG
+#define MJExtensionLog(...) NSLog(__VA_ARGS__)
+#else
+#define MJExtensionLog(...)
+#endif
+
+/**
+ * 断言
+ * @param condition   条件
+ * @param returnValue 返回值
+ */
+#define MJExtensionAssertError(condition, returnValue, clazz, msg) \
+[clazz setMj_error:nil]; \
+if ((condition) == NO) { \
+    MJExtensionBuildError(clazz, msg); \
+    return returnValue;\
+}
+
+#define MJExtensionAssert2(condition, returnValue) \
+if ((condition) == NO) return returnValue;
+
+/**
+ * 断言
+ * @param condition   条件
+ */
+#define MJExtensionAssert(condition) MJExtensionAssert2(condition, )
+
+/**
+ * 断言
+ * @param param         参数
+ * @param returnValue   返回值
+ */
+#define MJExtensionAssertParamNotNil2(param, returnValue) \
+MJExtensionAssert2((param) != nil, returnValue)
+
+/**
+ * 断言
+ * @param param   参数
+ */
+#define MJExtensionAssertParamNotNil(param) MJExtensionAssertParamNotNil2(param, )
+
+/**
+ * 打印所有的属性
+ */
+#define MJLogAllIvars \
+- (NSString *)description \
+{ \
+    return [self mj_keyValues].description; \
+}
+#define MJExtensionLogAllProperties MJLogAllIvars
+
+/** 仅在 Debugger 展示所有的属性 */
+#define MJImplementDebugDescription \
+- (NSString *)debugDescription \
+{ \
+return [self mj_keyValues].debugDescription; \
+}
+
+/**
+ *  类型(属性类型)
+ */
+FOUNDATION_EXPORT NSString *const MJPropertyTypeInt;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeShort;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeFloat;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeDouble;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeLong;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeLongLong;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeChar;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeBOOL1;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeBOOL2;
+FOUNDATION_EXPORT NSString *const MJPropertyTypePointer;
+
+FOUNDATION_EXPORT NSString *const MJPropertyTypeIvar;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeMethod;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeBlock;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeClass;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeSEL;
+FOUNDATION_EXPORT NSString *const MJPropertyTypeId;
+
+#endif

+ 27 - 0
AICityProperty/Pods/MJExtension/MJExtension/MJExtensionConst.m

@@ -0,0 +1,27 @@
+#ifndef __MJExtensionConst__M__
+#define __MJExtensionConst__M__
+
+#import <Foundation/Foundation.h>
+
+/**
+ *  成员变量类型(属性类型)
+ */
+NSString *const MJPropertyTypeInt = @"i";
+NSString *const MJPropertyTypeShort = @"s";
+NSString *const MJPropertyTypeFloat = @"f";
+NSString *const MJPropertyTypeDouble = @"d";
+NSString *const MJPropertyTypeLong = @"l";
+NSString *const MJPropertyTypeLongLong = @"q";
+NSString *const MJPropertyTypeChar = @"c";
+NSString *const MJPropertyTypeBOOL1 = @"c";
+NSString *const MJPropertyTypeBOOL2 = @"b";
+NSString *const MJPropertyTypePointer = @"*";
+
+NSString *const MJPropertyTypeIvar = @"^{objc_ivar=}";
+NSString *const MJPropertyTypeMethod = @"^{objc_method=}";
+NSString *const MJPropertyTypeBlock = @"@?";
+NSString *const MJPropertyTypeClass = @"#";
+NSString *const MJPropertyTypeSEL = @":";
+NSString *const MJPropertyTypeId = @"@";
+
+#endif

+ 16 - 0
AICityProperty/Pods/MJExtension/MJExtension/MJFoundation.h

@@ -0,0 +1,16 @@
+//
+//  MJFoundation.h
+//  MJExtensionExample
+//
+//  Created by MJ Lee on 14/7/16.
+//  Copyright (c) 2014年 小码哥. All rights reserved.
+//
+
+#import <Foundation/Foundation.h>
+
+@interface MJFoundation : NSObject
+
++ (BOOL)isClassFromFoundation:(Class)c;
++ (BOOL)isFromNSObjectProtocolProperty:(NSString *)propertyName;
+
+@end

+ 70 - 0
AICityProperty/Pods/MJExtension/MJExtension/MJFoundation.m

@@ -0,0 +1,70 @@
+//
+//  MJFoundation.m
+//  MJExtensionExample
+//
+//  Created by MJ Lee on 14/7/16.
+//  Copyright (c) 2014年 小码哥. All rights reserved.
+//
+
+#import "MJFoundation.h"
+#import "MJExtensionConst.h"
+#import <CoreData/CoreData.h>
+#import "objc/runtime.h"
+
+@implementation MJFoundation
+
++ (BOOL)isClassFromFoundation:(Class)c
+{
+    if (c == [NSObject class] || c == [NSManagedObject class]) return YES;
+    
+    static NSSet *foundationClasses;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        // 集合中没有NSObject,因为几乎所有的类都是继承自NSObject,具体是不是NSObject需要特殊判断
+        foundationClasses = [NSSet setWithObjects:
+                             [NSURL class],
+                             [NSDate class],
+                             [NSValue class],
+                             [NSData class],
+                             [NSError class],
+                             [NSArray class],
+                             [NSDictionary class],
+                             [NSString class],
+                             [NSAttributedString class], nil];
+    });
+    
+    __block BOOL result = NO;
+    [foundationClasses enumerateObjectsUsingBlock:^(Class foundationClass, BOOL *stop) {
+        if ([c isSubclassOfClass:foundationClass]) {
+            result = YES;
+            *stop = YES;
+        }
+    }];
+    return result;
+}
+
++ (BOOL)isFromNSObjectProtocolProperty:(NSString *)propertyName
+{
+    if (!propertyName) return NO;
+    
+    static NSSet<NSString *> *objectProtocolPropertyNames;
+    static dispatch_once_t onceToken;
+    dispatch_once(&onceToken, ^{
+        unsigned int count = 0;
+        objc_property_t *propertyList = protocol_copyPropertyList(@protocol(NSObject), &count);
+        NSMutableSet *propertyNames = [NSMutableSet setWithCapacity:count];
+        for (int i = 0; i < count; i++) {
+            objc_property_t property = propertyList[i];
+            NSString *propertyName = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
+            if (propertyName) {
+                [propertyNames addObject:propertyName];
+            }
+        }
+        objectProtocolPropertyNames = [propertyNames copy];
+        free(propertyList);
+    });
+    
+    return [objectProtocolPropertyNames containsObject:propertyName];
+}
+
+@end

+ 53 - 0
AICityProperty/Pods/MJExtension/MJExtension/MJProperty.h

@@ -0,0 +1,53 @@
+//
+//  MJProperty.h
+//  MJExtensionExample
+//
+//  Created by MJ Lee on 15/4/17.
+//  Copyright (c) 2015年 小码哥. All rights reserved.
+//  包装一个成员属性
+
+#import <Foundation/Foundation.h>
+#import <objc/runtime.h>
+#import "MJPropertyType.h"
+#import "MJPropertyKey.h"
+
+/**
+ *  包装一个成员
+ */
+@interface MJProperty : NSObject
+/** 成员属性 */
+@property (nonatomic, assign) objc_property_t property;
+/** 成员属性的名字 */
+@property (nonatomic, readonly) NSString *name;
+
+/** 成员属性的类型 */
+@property (nonatomic, readonly) MJPropertyType *type;
+/** 成员属性来源于哪个类(可能是父类) */
+@property (nonatomic, assign) Class srcClass;
+
+/**** 同一个成员属性 - 父类和子类的行为可能不一致(originKey、propertyKeys、objectClassInArray) ****/
+/** 设置最原始的key */
+- (void)setOriginKey:(id)originKey forClass:(Class)c;
+/** 对应着字典中的多级key(里面存放的数组,数组里面都是MJPropertyKey对象) */
+- (NSArray *)propertyKeysForClass:(Class)c;
+
+/** 模型数组中的模型类型 */
+- (void)setObjectClassInArray:(Class)objectClass forClass:(Class)c;
+- (Class)objectClassInArrayForClass:(Class)c;
+/**** 同一个成员变量 - 父类和子类的行为可能不一致(key、keys、objectClassInArray) ****/
+
+/**
+ * 设置object的成员变量值
+ */
+- (void)setValue:(id)value forObject:(id)object;
+/**
+ * 得到object的成员属性值
+ */
+- (id)valueForObject:(id)object;
+
+/**
+ *  初始化
+ */
++ (instancetype)cachedPropertyWithProperty:(objc_property_t)property;
+
+@end

+ 211 - 0
AICityProperty/Pods/MJExtension/MJExtension/MJProperty.m

@@ -0,0 +1,211 @@
+//
+//  MJProperty.m
+//  MJExtensionExample
+//
+//  Created by MJ Lee on 15/4/17.
+//  Copyright (c) 2015年 小码哥. All rights reserved.
+//
+
+#import "MJProperty.h"
+#import "MJFoundation.h"
+#import "MJExtensionConst.h"
+#import <objc/message.h>
+#include "TargetConditionals.h"
+
+@interface MJProperty()
+@property (strong, nonatomic) NSMutableDictionary *propertyKeysDict;
+@property (strong, nonatomic) NSMutableDictionary *objectClassInArrayDict;
+@property (strong, nonatomic) dispatch_semaphore_t propertyKeysLock;
+@property (strong, nonatomic) dispatch_semaphore_t objectClassInArrayLock;
+@end
+
+@implementation MJProperty
+
+#pragma mark - 初始化
+- (instancetype)init
+{
+    if (self = [super init]) {
+        _propertyKeysDict = [NSMutableDictionary dictionary];
+        _objectClassInArrayDict = [NSMutableDictionary dictionary];
+        _propertyKeysLock = dispatch_semaphore_create(1);
+        _objectClassInArrayLock = dispatch_semaphore_create(1);
+    }
+    return self;
+}
+
+#pragma mark - 缓存
++ (instancetype)cachedPropertyWithProperty:(objc_property_t)property
+{
+    MJProperty *propertyObj = objc_getAssociatedObject(self, property);
+    if (propertyObj == nil) {
+        propertyObj = [[self alloc] init];
+        propertyObj.property = property;
+        objc_setAssociatedObject(self, property, propertyObj, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
+    }
+    return propertyObj;
+}
+
+#pragma mark - 公共方法
+- (void)setProperty:(objc_property_t)property
+{
+    _property = property;
+    
+    MJExtensionAssertParamNotNil(property);
+    
+    // 1.属性名
+    _name = @(property_getName(property));
+    
+    // 2.成员类型
+    NSString *attrs = @(property_getAttributes(property));
+    NSUInteger dotLoc = [attrs rangeOfString:@","].location;
+    NSString *code = nil;
+    NSUInteger loc = 1;
+    if (dotLoc == NSNotFound) { // 没有,
+        code = [attrs substringFromIndex:loc];
+    } else {
+        code = [attrs substringWithRange:NSMakeRange(loc, dotLoc - loc)];
+    }
+    _type = [MJPropertyType cachedTypeWithCode:code];
+}
+
+/**
+ *  获得成员变量的值
+ */
+- (id)valueForObject:(id)object
+{
+    if (self.type.KVCDisabled) return [NSNull null];
+    
+    id value = [object valueForKey:self.name];
+    
+    // 32位BOOL类型转换json后成Int类型
+    /** https://github.com/CoderMJLee/MJExtension/issues/545 */
+    // 32 bit device OR 32 bit Simulator
+#if defined(__arm__) || (TARGET_OS_SIMULATOR && !__LP64__)
+    if (self.type.isBoolType) {
+        value = @([(NSNumber *)value boolValue]);
+    }
+#endif
+    
+    return value;
+}
+
+/**
+ *  设置成员变量的值
+ */
+- (void)setValue:(id)value forObject:(id)object
+{
+    if (self.type.KVCDisabled || value == nil) return;
+    [object setValue:value forKey:self.name];
+}
+
+/**
+ *  通过字符串key创建对应的keys
+ */
+- (NSArray *)propertyKeysWithStringKey:(NSString *)stringKey
+{
+    if (stringKey.length == 0) return nil;
+    
+    NSMutableArray *propertyKeys = [NSMutableArray array];
+    // 如果有多级映射
+    NSArray *oldKeys = [stringKey componentsSeparatedByString:@"."];
+    
+    for (NSString *oldKey in oldKeys) {
+        NSUInteger start = [oldKey rangeOfString:@"["].location;
+        if (start != NSNotFound) { // 有索引的key
+            NSString *prefixKey = [oldKey substringToIndex:start];
+            NSString *indexKey = prefixKey;
+            if (prefixKey.length) {
+                MJPropertyKey *propertyKey = [[MJPropertyKey alloc] init];
+                propertyKey.name = prefixKey;
+                [propertyKeys addObject:propertyKey];
+                
+                indexKey = [oldKey stringByReplacingOccurrencesOfString:prefixKey withString:@""];
+            }
+            
+            /** 解析索引 **/
+            // 元素
+            NSArray *cmps = [[indexKey stringByReplacingOccurrencesOfString:@"[" withString:@""] componentsSeparatedByString:@"]"];
+            for (NSInteger i = 0; i<cmps.count - 1; i++) {
+                MJPropertyKey *subPropertyKey = [[MJPropertyKey alloc] init];
+                subPropertyKey.type = MJPropertyKeyTypeArray;
+                subPropertyKey.name = cmps[i];
+                [propertyKeys addObject:subPropertyKey];
+            }
+        } else { // 没有索引的key
+            MJPropertyKey *propertyKey = [[MJPropertyKey alloc] init];
+            propertyKey.name = oldKey;
+            [propertyKeys addObject:propertyKey];
+        }
+    }
+    
+    return propertyKeys;
+}
+
+/** 对应着字典中的key */
+- (void)setOriginKey:(id)originKey forClass:(Class)c
+{
+    if ([originKey isKindOfClass:[NSString class]]) { // 字符串类型的key
+        NSArray *propertyKeys = [self propertyKeysWithStringKey:originKey];
+        if (propertyKeys.count) {
+            [self setPropertyKeys:@[propertyKeys] forClass:c];
+        }
+    } else if ([originKey isKindOfClass:[NSArray class]]) {
+        NSMutableArray *keyses = [NSMutableArray array];
+        for (NSString *stringKey in originKey) {
+            NSArray *propertyKeys = [self propertyKeysWithStringKey:stringKey];
+            if (propertyKeys.count) {
+                [keyses addObject:propertyKeys];
+            }
+        }
+        if (keyses.count) {
+            [self setPropertyKeys:keyses forClass:c];
+        }
+    }
+}
+
+/** 对应着字典中的多级key */
+- (void)setPropertyKeys:(NSArray *)propertyKeys forClass:(Class)c
+{
+    if (propertyKeys.count == 0) return;
+    NSString *key = NSStringFromClass(c);
+    if (!key) return;
+    
+    MJ_LOCK(self.propertyKeysLock);
+    self.propertyKeysDict[key] = propertyKeys;
+    MJ_UNLOCK(self.propertyKeysLock);
+}
+
+- (NSArray *)propertyKeysForClass:(Class)c
+{
+    NSString *key = NSStringFromClass(c);
+    if (!key) return nil;
+    
+    MJ_LOCK(self.propertyKeysLock);
+    NSArray *propertyKeys = self.propertyKeysDict[key];
+    MJ_UNLOCK(self.propertyKeysLock);
+    return propertyKeys;
+}
+
+/** 模型数组中的模型类型 */
+- (void)setObjectClassInArray:(Class)objectClass forClass:(Class)c
+{
+    if (!objectClass) return;
+    NSString *key = NSStringFromClass(c);
+    if (!key) return;
+    
+    MJ_LOCK(self.objectClassInArrayLock);
+    self.objectClassInArrayDict[key] = objectClass;
+    MJ_UNLOCK(self.objectClassInArrayLock);
+}
+
+- (Class)objectClassInArrayForClass:(Class)c
+{
+    NSString *key = NSStringFromClass(c);
+    if (!key) return nil;
+    
+    MJ_LOCK(self.objectClassInArrayLock);
+    Class objectClass = self.objectClassInArrayDict[key];
+    MJ_UNLOCK(self.objectClassInArrayLock);
+    return objectClass;
+}
+@end

Some files were not shown because too many files changed in this diff