张国栋 1 mesiac pred
rodič
commit
2c93a93219
28 zmenil súbory, kde vykonal 456 pridanie a 127 odobranie
  1. 24 0
      AICityProperty/AICity.xcodeproj/project.pbxproj
  2. 20 1
      AICityProperty/AICity.xcodeproj/xcshareddata/xcschemes/AICity.xcscheme
  3. BIN
      AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/UserInterfaceState.xcuserstate
  4. 0 32
      AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
  5. 2 0
      AICityProperty/AICity/JuXing/Models/JXCommentContent.h
  6. 2 0
      AICityProperty/AICity/JuXing/Models/JXCommentContent.m
  7. 1 0
      AICityProperty/AICity/JuXing/Models/JXDramaContent.h
  8. 2 0
      AICityProperty/AICity/JuXing/Models/JXDramaContent.m
  9. 3 1
      AICityProperty/AICity/JuXing/Services/JXNetworkManager.m
  10. 1 1
      AICityProperty/AICity/JuXing/ViewControllers/JXDetailViewController.h
  11. 53 35
      AICityProperty/AICity/JuXing/ViewControllers/JXDetailViewController.m
  12. 5 6
      AICityProperty/AICity/JuXing/ViewControllers/JXShortDramaViewController.m
  13. 59 35
      AICityProperty/AICity/JuXing/Views/JXCollectionViewController.m
  14. 49 10
      AICityProperty/AICity/JuXing/Views/JXCommentViewController.m
  15. 1 1
      AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m
  16. 0 1
      AICityProperty/AICity/Utils/GuestHelper.m
  17. 19 0
      AICityProperty/viewsNew/CommentFooterView.h
  18. 26 0
      AICityProperty/viewsNew/CommentFooterView.m
  19. 63 0
      AICityProperty/viewsNew/CommentFooterView.xib
  20. 7 1
      AICityProperty/viewsNew/CommentItemCell.h
  21. 10 0
      AICityProperty/viewsNew/CommentItemCell.m
  22. 13 0
      AICityProperty/viewsNew/CommentItemCell.xib
  23. 17 0
      AICityProperty/viewsNew/emptyTCell.h
  24. 24 0
      AICityProperty/viewsNew/emptyTCell.m
  25. 24 0
      AICityProperty/viewsNew/emptyTCell.xib
  26. 7 0
      AICityProperty/viewsNew/videoItemsCell.h
  27. 10 0
      AICityProperty/viewsNew/videoItemsCell.m
  28. 14 3
      AICityProperty/viewsNew/videoItemsCell.xib

+ 24 - 0
AICityProperty/AICity.xcodeproj/project.pbxproj

@@ -59,6 +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 */; };
+		93C55BF52EA87CFC00AEB59E /* CommentFooterView.h in Headers */ = {isa = PBXBuildFile; fileRef = 93C55BF32EA87CFC00AEB59E /* CommentFooterView.h */; };
+		93C55BF62EA87CFC00AEB59E /* CommentFooterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 93C55BF42EA87CFC00AEB59E /* CommentFooterView.m */; };
+		93C55BF82EA87D0300AEB59E /* CommentFooterView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93C55BF72EA87D0300AEB59E /* CommentFooterView.xib */; };
+		93C55BFC2EA8851400AEB59E /* emptyTCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 93C55BFB2EA8851400AEB59E /* emptyTCell.xib */; };
+		93C55BFD2EA8851400AEB59E /* emptyTCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 93C55BF92EA8851400AEB59E /* emptyTCell.h */; };
+		93C55BFE2EA8851400AEB59E /* emptyTCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 93C55BFA2EA8851400AEB59E /* emptyTCell.m */; };
 		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 */; };
@@ -248,6 +254,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>"; };
+		93C55BF32EA87CFC00AEB59E /* CommentFooterView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CommentFooterView.h; sourceTree = "<group>"; };
+		93C55BF42EA87CFC00AEB59E /* CommentFooterView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CommentFooterView.m; sourceTree = "<group>"; };
+		93C55BF72EA87D0300AEB59E /* CommentFooterView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = CommentFooterView.xib; sourceTree = "<group>"; };
+		93C55BF92EA8851400AEB59E /* emptyTCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = emptyTCell.h; sourceTree = "<group>"; };
+		93C55BFA2EA8851400AEB59E /* emptyTCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = emptyTCell.m; sourceTree = "<group>"; };
+		93C55BFB2EA8851400AEB59E /* emptyTCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = emptyTCell.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>"; };
@@ -485,6 +497,12 @@
 				93CB0FE72EA7AE9C00ACFECB /* CommentRpItemCell.h */,
 				93CB0FE82EA7AE9C00ACFECB /* CommentRpItemCell.m */,
 				93CB0FE92EA7AE9C00ACFECB /* CommentRpItemCell.xib */,
+				93C55BF32EA87CFC00AEB59E /* CommentFooterView.h */,
+				93C55BF42EA87CFC00AEB59E /* CommentFooterView.m */,
+				93C55BF72EA87D0300AEB59E /* CommentFooterView.xib */,
+				93C55BF92EA8851400AEB59E /* emptyTCell.h */,
+				93C55BFA2EA8851400AEB59E /* emptyTCell.m */,
+				93C55BFB2EA8851400AEB59E /* emptyTCell.xib */,
 				93A566D82EA73C7500818C54 /* EXTView */,
 			);
 			path = viewsNew;
@@ -961,10 +979,12 @@
 			isa = PBXHeadersBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				93C55BF52EA87CFC00AEB59E /* CommentFooterView.h in Headers */,
 				93A566CE2EA72F4A00818C54 /* GDNavigationController.h in Headers */,
 				93A566DA2EA73C7500818C54 /* EXTView.h in Headers */,
 				93A566D32EA7387800818C54 /* videoItemsCell.h in Headers */,
 				93CB0FE62EA7A87C00ACFECB /* CommentItemCell.h in Headers */,
+				93C55BFD2EA8851400AEB59E /* emptyTCell.h in Headers */,
 				93A566DE2EA75F5F00818C54 /* videoItemsNavCell.h in Headers */,
 				93CB0FEC2EA7AE9C00ACFECB /* CommentRpItemCell.h in Headers */,
 			);
@@ -1078,9 +1098,11 @@
 			isa = PBXResourcesBuildPhase;
 			buildActionMask = 2147483647;
 			files = (
+				93C55BF82EA87D0300AEB59E /* CommentFooterView.xib in Resources */,
 				93A566E02EA75F5F00818C54 /* videoItemsNavCell.xib in Resources */,
 				93A566D52EA7387800818C54 /* videoItemsCell.xib in Resources */,
 				93CB0FEA2EA7AE9C00ACFECB /* CommentRpItemCell.xib in Resources */,
+				93C55BFC2EA8851400AEB59E /* emptyTCell.xib in Resources */,
 				A87370A222DD993D002F651C /* LaunchScreen.storyboard in Resources */,
 				A873709F22DD993D002F651C /* Assets.xcassets in Resources */,
 				AC84AB472A5968DE00317AFC /* ZFRotationViewController.xib in Resources */,
@@ -1228,6 +1250,7 @@
 				AC9A8C842A5D4D3B000CC169 /* NetworkingMonitor.m in Sources */,
 				AC84AB532A5968DE00317AFC /* ZFSmallPlayViewController.m in Sources */,
 				93A566D42EA7387800818C54 /* videoItemsCell.m in Sources */,
+				93C55BF62EA87CFC00AEB59E /* CommentFooterView.m in Sources */,
 				93A566CD2EA72F4A00818C54 /* GDNavigationController.m in Sources */,
 				AC8544A12A69274C00920569 /* DelAccProtocolViewController.m in Sources */,
 				AC84AB3F2A5968DE00317AFC /* ZFCollectionViewListController.m in Sources */,
@@ -1286,6 +1309,7 @@
 				AC8544972A68CCD100920569 /* MBProgressHUD+MJ.m in Sources */,
 				AC84AB452A5968DE00317AFC /* ZFCustomControlView.m in Sources */,
 				AC84AB4B2A5968DE00317AFC /* ZFTableSectionModel.m in Sources */,
+				93C55BFE2EA8851400AEB59E /* emptyTCell.m in Sources */,
 				AC84AB482A5968DE00317AFC /* ZFRotationViewController.m in Sources */,
 				AC84AB542A5968DE00317AFC /* ZFNotAutoPlayViewController.m in Sources */,
 			);

+ 20 - 1
AICityProperty/AICity.xcodeproj/xcshareddata/xcschemes/AICity.xcscheme

@@ -53,7 +53,7 @@
       </Testables>
    </TestAction>
    <LaunchAction
-      buildConfiguration = "Release"
+      buildConfiguration = "Debug"
       selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
       selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
       launchStyle = "0"
@@ -72,6 +72,25 @@
             ReferencedContainer = "container:AICity.xcodeproj">
          </BuildableReference>
       </BuildableProductRunnable>
+      <EnvironmentVariables>
+         <EnvironmentVariable
+            key = "MallocStackLoggingNoCompact"
+            value = "YES"
+            isEnabled = "YES">
+         </EnvironmentVariable>
+         <EnvironmentVariable
+            key = "NSZombieEnabled"
+            value = "YES"
+            isEnabled = "YES">
+         </EnvironmentVariable>
+      </EnvironmentVariables>
+      <AdditionalOptions>
+         <AdditionalOption
+            key = "NSZombieEnabled"
+            value = "YES"
+            isEnabled = "YES">
+         </AdditionalOption>
+      </AdditionalOptions>
    </LaunchAction>
    <ProfileAction
       buildConfiguration = "Release"

BIN
AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/UserInterfaceState.xcuserstate


+ 0 - 32
AICityProperty/AICity.xcworkspace/xcuserdata/zhangguodong.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist

@@ -20,38 +20,6 @@
             landmarkType = "7">
          </BreakpointContent>
       </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "E58016ED-4038-4CF5-A643-9FF8796B290E"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/Utils/GuestHelper.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "34"
-            endingLineNumber = "34"
-            landmarkName = "-checkLoginWithViewController:action:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
-      <BreakpointProxy
-         BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
-         <BreakpointContent
-            uuid = "45147146-FECD-47F8-BC31-AD09815C537F"
-            shouldBeEnabled = "Yes"
-            ignoreCount = "0"
-            continueAfterRunningActions = "No"
-            filePath = "AICity/Utils/GuestHelper.m"
-            startingColumnNumber = "9223372036854775807"
-            endingColumnNumber = "9223372036854775807"
-            startingLineNumber = "38"
-            endingLineNumber = "38"
-            landmarkName = "-checkLoginWithViewController:action:"
-            landmarkType = "7">
-         </BreakpointContent>
-      </BreakpointProxy>
       <BreakpointProxy
          BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint">
          <BreakpointContent

+ 2 - 0
AICityProperty/AICity/JuXing/Models/JXCommentContent.h

@@ -27,8 +27,10 @@ NS_ASSUME_NONNULL_BEGIN
 
 #pragma mark - 交互数据
 @property (nonatomic, assign) long long likeCount;
+@property (nonatomic, assign) long long reply_count;
 @property (nonatomic, assign) long long replyCount;
 @property (nonatomic, assign) BOOL isLiked;
+@property (nonatomic, assign) BOOL isOpen;
 
 #pragma mark - 时间信息
 @property (nonatomic, assign) long long createdAt;  // Unix时间戳(毫秒)

+ 2 - 0
AICityProperty/AICity/JuXing/Models/JXCommentContent.m

@@ -39,6 +39,7 @@
         _content = dict[@"content"] ?: @"";
         _likeCount = [dict[@"likeCount"] longLongValue];
         _replyCount = [dict[@"replyCount"] longLongValue];
+        _reply_count = [dict[@"reply_count"] longLongValue];
         _isLiked = [dict[@"isLiked"] boolValue];
         _createdAt = [dict[@"createdAt"] longLongValue];
         _isVerified = [dict[@"isVerified"] boolValue];
@@ -59,6 +60,7 @@
         @"content": self.content,
         @"likeCount": @(self.likeCount),
         @"replyCount": @(self.replyCount),
+        @"reply_count": @(self.reply_count),
         @"isLiked": @(self.isLiked),
         @"createdAt": @(self.createdAt),
         @"isVerified": @(self.isVerified)

+ 1 - 0
AICityProperty/AICity/JuXing/Models/JXDramaContent.h

@@ -52,6 +52,7 @@ NS_ASSUME_NONNULL_BEGIN
 @property (nonatomic, copy, nullable) NSString *title;          // 剧集标题
 @property (nonatomic, copy, nullable) NSString *coverUrl;       // 封面图URL
 @property (nonatomic, copy, nullable) NSString *description;    // 描述
+@property (nonatomic, copy, nullable) NSString *descriptions;    // 描述
 
 #pragma mark - 初始化方法
 - (instancetype)initWithDictionary:(NSDictionary *)dict;

+ 2 - 0
AICityProperty/AICity/JuXing/Models/JXDramaContent.m

@@ -54,6 +54,7 @@
         
         // 注:description 字段已通过后端返回,但在这里暂时跳过以避免属性冲突
         // 如需要可在需要时单独处理
+        _descriptions = dict[@"description"] ?: dict[@"description"];  // 优先使用竖版封面
         
         }
     return self;
@@ -91,6 +92,7 @@
     if (self.title) dict[@"title"] = self.title;
     if (self.coverUrl) dict[@"coverUrl"] = self.coverUrl;
     if (self.description) dict[@"description"] = self.description;
+    if (self.descriptions) dict[@"descriptions"] = self.descriptions;
     
     return [dict copy];
 }

+ 3 - 1
AICityProperty/AICity/JuXing/Services/JXNetworkManager.m

@@ -31,7 +31,9 @@
     if (self) {
         // Debug 环境使用本地开发服务器,Release 环境使用生产服务器
         #ifdef DEBUG
-            _baseURL = @"http://192.168.110.66:8888/api/v1/";
+//            _baseURL = @"http://192.168.110.66:8888/api/v1/";
+        _baseURL = @"https://backend.jsnoopyay.com/api/v1/";
+
             NSLog(@"[JXNetworkManager] Using DEBUG BaseURL: %@", _baseURL);
         #else
             _baseURL = @"https://backend.jsnoopyay.com/api/v1/";

+ 1 - 1
AICityProperty/AICity/JuXing/ViewControllers/JXDetailViewController.h

@@ -21,7 +21,7 @@ NS_ASSUME_NONNULL_BEGIN
 @interface JXDetailViewController : UIViewController
 
 @property (nonatomic, copy) NSString *dramaId;
-
+@property (nonatomic,assign) NSInteger playIndex;
 /**
  * 初始化方法
  * @param dramaId 短剧ID

+ 53 - 35
AICityProperty/AICity/JuXing/ViewControllers/JXDetailViewController.m

@@ -16,6 +16,7 @@
 #import "JXSuperPlayer.h"
 #import <AVFoundation/AVFoundation.h>
 #import "JXCollectionViewController.h"
+#import "JXCommentViewController.h"
 @interface JXDetailViewController () <JXSuperPlayerDelegate, UICollectionViewDelegate, UICollectionViewDataSource,JXCollectionViewControllerDelegate>
 
 // 播放器
@@ -122,8 +123,8 @@
             NSLog(@"⏯️ 自动滚动检查 - 剧集总数: %lu", (unsigned long)self.episodes.count);
             if (self.episodes.count > 0) {
                 NSLog(@"⏯️ 滚动到第一集");
-                [self.episodeCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] 
-                                                    atScrollPosition:UICollectionViewScrollPositionCenteredVertically 
+                [self.episodeCollectionView scrollToItemAtIndexPath:[NSIndexPath indexPathForItem:self.playIndex inSection:0]
+                                                    atScrollPosition:UICollectionViewScrollPositionCenteredVertically
                                                             animated:NO];
             } else {
                 NSLog(@"❌ 剧集列表为空,无法播放");
@@ -188,12 +189,10 @@
    
     
     // 右侧互动按钮
-//    [self setupInteractionButtonsForCell:cell atY:y];
+    [self setupInteractionButtonsForCell:cell];
     
    
     
-    
-    
     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];
@@ -218,20 +217,29 @@
     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)];
+    UILabel *descLabel = [[UILabel alloc] init];
     descLabel.font = [UIFont systemFontOfSize:15 weight:UIFontWeightMedium];
     descLabel.textColor = [UIColor whiteColor];
     descLabel.numberOfLines = 2;
     [cell.contentView addSubview:descLabel];
     [cell.contentView bringSubviewToFront:descLabel];
+    [descLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(bottomView.mas_top).offset(-15);
+        make.left.equalTo(cell.contentView).offset(16);
+        make.width.mas_equalTo(SCREEN_WIDTH - 90);
+    }];
     
-    
-    UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, CGRectGetMinY(descLabel.frame) - 50, width - 100, 40)];
+    UILabel *titleLabel = [[UILabel alloc] init];
     titleLabel.font = [UIFont boldSystemFontOfSize:18];
     titleLabel.textColor = [UIColor whiteColor];
     titleLabel.numberOfLines = 2;
     [cell.contentView addSubview:titleLabel];
     [cell.contentView bringSubviewToFront:titleLabel];
+    [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
+        make.bottom.equalTo(descLabel.mas_top).offset(-12.5);
+        make.left.equalTo(cell.contentView).offset(16);
+        make.width.mas_equalTo(SCREEN_WIDTH - 90);
+    }];
     
 //    // 作者
 //    UILabel *authorLabel = [[UILabel alloc] initWithFrame:CGRectMake(16, y, width - 32, 20)];
@@ -251,7 +259,7 @@
 //    
 //    // 更新标签
     titleLabel.text = self.drama.title ?: @"";
-    descLabel.text = self.drama.desc ?: @"";
+    descLabel.text = episode.title ?: @"";
 //    authorLabel.text = [NSString stringWithFormat:@"@%@", self.drama.authorInfo ?: @"未知"];
 //    
 //    // 剧集编号和标题
@@ -278,7 +286,6 @@
 - (void)showCollectionDialogWithDramaId:(NSString *)dramaId {
     JXCollectionViewController *collectionVC = [[JXCollectionViewController alloc] initWithDramaId:dramaId];
     collectionVC.delegate = self;
-    
     // 设置弹窗样式(底部弹出)
     if (@available(iOS 15.0, *)) {
         UISheetPresentationController *sheet = collectionVC.sheetPresentationController;
@@ -291,6 +298,25 @@
     
     [self presentViewController:collectionVC animated:YES completion:nil];
 }
+- (void)commentDidClicked{
+    JXEpisode *episode = self.episodes[self.currentEpisodeIndex];
+    JXCommentViewController *commentVC = [[JXCommentViewController alloc] initWithDramaId:[NSString stringWithFormat:@"%ld",episode.dramaId]];
+    // 设置弹窗样式(底部弹出)
+    if (@available(iOS 15.0, *)) {
+        UISheetPresentationController *sheet = commentVC.sheetPresentationController;
+        sheet.detents = @[
+            [UISheetPresentationControllerDetent mediumDetent],
+            [UISheetPresentationControllerDetent largeDetent]
+        ];
+        sheet.prefersGrabberVisible = YES;
+    }
+    [self presentViewController:commentVC animated:YES completion:^{
+        NSLog(@"[JXShortDrama] 🗨️ commentVC present 完成!");
+    }];
+}
+
+
+
 - (void)collectionViewControllerDidSelectEpisode:(NSString *)episodeId {
     NSLog(@"[JXShortDrama] 选择播放剧集: %@", episodeId);
     
@@ -317,56 +343,48 @@
 
 #pragma mark - Helper Methods
 
-- (void)setupInteractionButtonsForCell:(UICollectionViewCell *)cell atY:(CGFloat)y {
+- (void)setupInteractionButtonsForCell:(UICollectionViewCell *)cell {
     CGFloat width = cell.contentView.bounds.size.width;
-    
-    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(width - 70, y, 60, 180)];
+    UIView *container = [[UIView alloc] initWithFrame:CGRectMake(width - 48, kScreenHeight - safebottom - 190 - 90, 32, 190)];
     [cell.contentView addSubview:container];
     
-    CGFloat buttonY = 0;
     
     // 点赞
-    UIButton *likeButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    likeButton.frame = CGRectMake(10, buttonY, 40, 40);
-    [likeButton setImage:[UIImage systemImageNamed:@"heart"] forState:UIControlStateNormal];
-    [likeButton setImage:[UIImage systemImageNamed:@"heart.fill"] forState:UIControlStateSelected];
-    likeButton.tintColor = [UIColor whiteColor];
+    UIButton *likeButton = [UIButton buttonWithType:UIButtonTypeCustom];
+    likeButton.frame = CGRectMake(0, 0, 32, 32);
+    [likeButton setImage:[UIImage imageNamed:@"icon 1.1"] forState:UIControlStateNormal];
+    [likeButton setImage:[UIImage imageNamed:@"icon 1.5"] forState:UIControlStateSelected];
     [container addSubview:likeButton];
     
-    UILabel *likeCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, buttonY + 40, 60, 20)];
+    UILabel *likeCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 40, 32, 18)];
     likeCountLabel.textAlignment = NSTextAlignmentCenter;
     likeCountLabel.font = [UIFont systemFontOfSize:12];
     likeCountLabel.textColor = [UIColor whiteColor];
     likeCountLabel.text = [self formatCount:self.interaction.likeCount];
     [container addSubview:likeCountLabel];
     
-    buttonY += 70;
-    
     // 收藏
-    UIButton *favoriteButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    favoriteButton.frame = CGRectMake(10, buttonY, 40, 40);
-    [favoriteButton setImage:[UIImage systemImageNamed:@"star"] forState:UIControlStateNormal];
-    [favoriteButton setImage:[UIImage systemImageNamed:@"star.fill"] forState:UIControlStateSelected];
-    favoriteButton.tintColor = [UIColor whiteColor];
+    UIButton *favoriteButton = [UIButton buttonWithType:UIButtonTypeCustom];
+    favoriteButton.frame = CGRectMake(0, CGRectGetMaxY(likeCountLabel.frame) + 20, 32, 32);
+    [favoriteButton setImage:[UIImage imageNamed:@"icon 1.2"] forState:UIControlStateNormal];
+    [favoriteButton setImage:[UIImage imageNamed:@"icon 1.5"] forState:UIControlStateSelected];
     [container addSubview:favoriteButton];
     
-    UILabel *favoriteCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, buttonY + 40, 60, 20)];
+    UILabel *favoriteCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(favoriteButton.frame), 32, 18)];
     favoriteCountLabel.textAlignment = NSTextAlignmentCenter;
     favoriteCountLabel.font = [UIFont systemFontOfSize:12];
     favoriteCountLabel.textColor = [UIColor whiteColor];
     favoriteCountLabel.text = [self formatCount:self.interaction.favoriteCount];
     [container addSubview:favoriteCountLabel];
     
-    buttonY += 70;
     
     // 评论
-    UIButton *commentButton = [UIButton buttonWithType:UIButtonTypeSystem];
-    commentButton.frame = CGRectMake(10, buttonY, 40, 40);
-    [commentButton setImage:[UIImage systemImageNamed:@"bubble.right"] forState:UIControlStateNormal];
-    commentButton.tintColor = [UIColor whiteColor];
+    UIButton *commentButton = [UIButton buttonWithType:UIButtonTypeCustom];
+    commentButton.frame = CGRectMake(0, CGRectGetMaxY(favoriteCountLabel.frame) + 20, 32, 32);
+    [commentButton setImage:[UIImage imageNamed:@"icon 1.3"] forState:UIControlStateNormal];
     [container addSubview:commentButton];
-//    [commentButton addTarget:self action:@selector(commentDidClicked) forControlEvents:UIControlEventTouchUpInside];
-    UILabel *commentCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, buttonY + 40, 60, 20)];
+    [commentButton addTarget:self action:@selector(commentDidClicked) forControlEvents:UIControlEventTouchUpInside];
+    UILabel *commentCountLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(commentButton.frame) , 32, 18)];
     commentCountLabel.textAlignment = NSTextAlignmentCenter;
     commentCountLabel.font = [UIFont systemFontOfSize:12];
     commentCountLabel.textColor = [UIColor whiteColor];

+ 5 - 6
AICityProperty/AICity/JuXing/ViewControllers/JXShortDramaViewController.m

@@ -481,7 +481,7 @@ static NSString * const kDramaCellIdentifier = @"JXShortDramaCell";
     // 登录检查
     BOOL isLoggedIn = [[GuestHelper sharedHelper] checkLoginWithViewController:self action:^{
         // 登录成功后重新执行点赞操作
-        [self handleLikeButtonAtIndex:index];
+//        [self handleLikeButtonAtIndex:index];
     }];
     
     if (!isLoggedIn) {
@@ -515,7 +515,7 @@ static NSString * const kDramaCellIdentifier = @"JXShortDramaCell";
     // 登录检查
     BOOL isLoggedIn = [[GuestHelper sharedHelper] checkLoginWithViewController:self action:^{
         // 登录成功后重新执行收藏操作
-        [self handleFavoriteButtonAtIndex:index];
+//        [self handleFavoriteButtonAtIndex:index];
     }];
     
     if (!isLoggedIn) {
@@ -780,10 +780,9 @@ 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]];
+    JXDramaContent *drama = self.dramaList[self.currentIndex];
+    JXDetailViewController *detailVC = [[JXDetailViewController alloc] initWithDramaId:[NSString stringWithFormat:@"%lld",drama.dramaId]];
+    detailVC.playIndex = (episodeId.intValue-1 < 0) ? 0 : episodeId.intValue-1;
     [self.navigationController pushViewController:detailVC animated:YES];
     
     

+ 59 - 35
AICityProperty/AICity/JuXing/Views/JXCollectionViewController.m

@@ -37,10 +37,10 @@
 #pragma mark - 数据
 @property (nonatomic, copy) NSString *dramaId;
 @property (nonatomic, strong) JXDrama *drama;
+@property (nonatomic, strong) NSDictionary *pageData;
 @property (nonatomic, strong) NSArray<JXEpisodeInfo *> *episodes;
 @property (nonatomic, strong) NSArray<JXEpisodeInfo *> *filteredEpisodes;
 @property (nonatomic, assign) NSInteger selectedRange;  // 0=全部, 1=1-50, 2=51-100
-
 @end
 
 @implementation JXCollectionViewController
@@ -62,7 +62,7 @@
     [super viewDidLoad];
     
     self.view.backgroundColor = [UIColor whiteColor];
-    
+    self.pageData = [[NSDictionary alloc] init];
     [self setupUI];
     [self loadData];
 }
@@ -206,6 +206,7 @@
 //    return button;
 //}
 - (void)setupCollectionViewnav{
+    
     UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
     layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
     layout.minimumLineSpacing = 6;
@@ -260,8 +261,8 @@
         NSDictionary *dramaDict = response[@"data"];
         
         // 解析短剧信息
-//        self.drama = [[JXDrama alloc] initWithDictionary:dramaDict];
-        self.drama = [JXDrama mj_objectWithKeyValues:dramaDict context:nil];
+        self.drama = [[JXDrama alloc] initWithDictionary:dramaDict[@"drama"]];
+        
         // 解析剧集列表
         NSArray *episodesArray = dramaDict[@"episodes"];
         NSMutableArray *episodes = [NSMutableArray array];
@@ -285,13 +286,13 @@
 //    self.statsLabel.text = [NSString stringWithFormat:@"共%ld集 · %@ 播放",
 //                           (long)self.drama.totalEpisodes,
 //                           [JXShortDramaCell formattedCountWithCount:self.drama.viewCount]];
-        self.statsLabel.text = [NSString stringWithFormat:@"%@ 播放 · 已更新至%ld集 · ", [JXShortDramaCell formattedCountWithCount:self.drama.viewCount], (long)self.drama.totalEpisodes];
+        self.statsLabel.text = [NSString stringWithFormat:@"%@ 播放 · 已更新至%ld集", [JXShortDramaCell formattedCountWithCount:self.drama.viewCount], (long)self.drama.totalEpisodes];
 }
 
 #pragma mark - 筛选逻辑
 
 - (void)filterEpisodesByRange:(NSInteger)range {
-    NSInteger all = self.drama.totalEpisodes == 0 ? 95 :self.drama.totalEpisodes;
+    NSInteger all = self.drama.totalEpisodes;
     if (all == 0) {
         return;
     }
@@ -310,11 +311,6 @@
     [self.collectionView reloadData];
 }
 
-//- (void)handleRangeButtonTap:(UIButton *)sender {
-//    [self selectRangeButton:sender];
-//    self.selectedRange = sender.tag;
-//    [self filterEpisodesByRange:self.selectedRange];
-//}
 
 - (void)selectRangeButton:(UIButton *)button {
     // 重置所有按钮
@@ -338,8 +334,7 @@
     if (collectionView == self.collectionViewNav) {
         return  self.navArray.count;
     }
-    return self.navArray.count ? 20 : 0; //写死的,后面要改
-//    return self.filteredEpisodes.count ;
+    return self.filteredEpisodes.count;
 }
 
 - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
@@ -370,7 +365,24 @@
     
     
     videoItemsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:NSStringFromClass(videoItemsCell.class) forIndexPath:indexPath];
-    
+    JXEpisodeInfo *episode = self.filteredEpisodes[indexPath.item];
+    cell.viewVIP.hidden = !episode.isPaid;
+    cell.btnVIP.hidden = !episode.isPaid;
+    cell.labelT.text = episode.title;
+    cell.labelView.text = [NSString stringWithFormat:@"%lld",episode.likeCount];
+    [cell.imgH sd_setImageWithURL:[NSURL URLWithString:episode.thumbnailUrl]];
+    cell.labelTime.text = [self getMMSSFromSS:episode.duration];
+    cell.vipClicked = ^{
+      //去会员
+        [MBProgressHUD showMessage:@"维护中..."];
+    };
+    cell.playClicked = ^{
+        if ([self.delegate respondsToSelector:@selector(collectionViewControllerDidSelectEpisode:)]) {
+            [self.delegate collectionViewControllerDidSelectEpisode:[NSString stringWithFormat:@"%ld",episode.episodeNumber]];
+        }
+        
+        [self dismissViewControllerAnimated:YES completion:nil];
+    };
 //    JXEpisodeInfo *episode = self.filteredEpisodes[indexPath.item];
     
     // 临时简单展示(后续可创建自定义Cell)
@@ -415,7 +427,14 @@
     
     return cell;
 }
-
+-(NSString *)getMMSSFromSS:(float)total{
+    int fen = (int)(total / 60 ) % 60;
+    int miao = (int)total % 60;
+    int shi = (int)(total / 3600);
+  
+    NSString *format_time = [NSString stringWithFormat:@"%@%@%@",shi>0 ?[NSString stringWithFormat:@"%02d:",shi]:@"",[NSString stringWithFormat:@"%02d:",fen],[NSString stringWithFormat:@"%02d",miao]];
+    return format_time;
+}
 #pragma mark - UICollectionViewDelegateFlowLayout
 
 - (CGSize)collectionView:(UICollectionView *)collectionView
@@ -448,25 +467,25 @@
         [self.collectionView reloadData];
         return ;
     }
-    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];
-    }
+//    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];
+//    }
     
 }
 
@@ -476,7 +495,12 @@
     }
     return _navArray;
 }
-
+- (NSDictionary *)pageData{
+    if (!_pageData) {
+        _pageData = [NSDictionary dictionary];
+    }
+    return _pageData;
+}
 #pragma mark - 关闭
 
 - (void)handleClose {

+ 49 - 10
AICityProperty/AICity/JuXing/Views/JXCommentViewController.m

@@ -10,6 +10,7 @@
 #import "JXCommentContent.h"
 #import "CommentItemCell.h"
 #import "CommentRpItemCell.h"
+#import "CommentFooterView.h"
 // Cell复用标识符
 static NSString * const kCommentCellIdentifier = @"JXCommentCell";
 
@@ -33,7 +34,7 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
 @property (nonatomic, assign) NSInteger currentPage;
 @property (nonatomic, assign) BOOL isLoading;
 @property (nonatomic, assign) BOOL hasMoreData;
-
+@property (strong, nonatomic) UIView *emptyView;
 // 回复相关
 @property (nonatomic, assign) long long replyToCommentId;
 @property (nonatomic, copy) NSString *replyToUserName;
@@ -144,6 +145,9 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
     self.tableView.backgroundColor = [UIColor whiteColor];
     [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.tableView registerNib:[UINib nibWithNibName:NSStringFromClass(CommentFooterView.class) bundle:nil] forHeaderFooterViewReuseIdentifier:NSStringFromClass(CommentFooterView.class)];
+    
+    
     [self.view addSubview:self.tableView];
     
     // 下拉刷新
@@ -171,6 +175,7 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
     self.inputTextField.placeholder = @"说点什么...";
     self.inputTextField.backgroundColor = RGBACOLOR(241, 242, 244, 1);
     self.inputTextField.layer.cornerRadius = 20;
+    self.inputTextField.returnKeyType = UIReturnKeySend;
     self.inputTextField.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 12, 0)];
     self.inputTextField.leftViewMode = UITextFieldViewModeAlways;
     self.inputTextField.delegate = self;
@@ -212,7 +217,7 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
         
         NSDictionary *data = response[@"data"];
         NSArray *list = data[@"list"];
-        long long totalCount = [data[@"total"] longLongValue];
+//        long long totalCount = [data[@"total"] longLongValue];
         
         // 更新标题
         self.titleLabel.text = [NSString stringWithFormat:@"全部评论"];
@@ -234,7 +239,7 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
         } else {
             [self.commentList addObjectsFromArray:models];
         }
-        
+        self.emptyView.hidden = NO;
         [self.tableView reloadData];
         
     } failure:^(NSError *error) {
@@ -261,17 +266,32 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
 
 #pragma mark - UITableViewDataSource
 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
-    return  5;
+    return  self.commentList.count;
 }
 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
-//    return self.commentList.count;
-    return 3;
+    JXCommentContent *comment = self.commentList[section];
+    return comment.isOpen ? comment.reply_count + 1 : 1;
 }
 
-- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {    
     if (indexPath.row == 0) {
         CommentItemCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(CommentItemCell.class) forIndexPath:indexPath];
         cell.selectionStyle = UITableViewCellSelectionStyleNone;
+        JXCommentContent *comment = self.commentList[indexPath.section];
+        cell.labelT.text = comment.userName.length ? comment.userName : @"用户001";
+        cell.labelC.text = comment.content;
+        cell.labelL.text = [NSString stringWithFormat:@"%lld",comment.likeCount];
+        if (comment.isLiked) {
+            cell.imgL.image = [UIImage imageNamed:@"icon-2.2(1)"];
+        }else{
+            cell.imgL.image = [UIImage imageNamed:@"icon-2.2 1"];
+        }
+        cell.likeClicked = ^{
+            [self handleLikeComment:comment];
+        };
+        cell.huifuClicked = ^{
+            [self handleReplyComment:comment];
+        };
         return cell;
     }
     CommentRpItemCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass(CommentRpItemCell.class) forIndexPath:indexPath];
@@ -292,9 +312,21 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
     
     return cell;
 }
-
+- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{
+    CommentFooterView *header = [tableView dequeueReusableHeaderFooterViewWithIdentifier:NSStringFromClass(CommentFooterView.class)];
+    JXCommentContent *comment = self.commentList[section];
+    header.btnOpen.selected = comment.isOpen;
+    header.btnClicked = ^{
+        comment.isOpen = !comment.isOpen;
+        [self.tableView reloadData];
+    };
+    return header;
+}
 #pragma mark - UITableViewDelegate
-
+- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
+    JXCommentContent *comment = self.commentList[section];
+    return comment.reply_count > 0 ? 0 : 40;
+}
 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
     return UITableViewAutomaticDimension;
 }
@@ -378,7 +410,14 @@ static NSString * const kCommentCellIdentifier = @"JXCommentCell";
     NSString *text = self.inputTextField.text;
     self.submitButton.enabled = (text.length > 0);
 }
-
+- (BOOL)textFieldShouldReturn:(UITextField *)textField{
+    if (textField.text.length == 0) {
+        [MBProgressHUD showMessage:@"请输入评论"];
+        return NO;
+    }
+    [self handleSubmit];
+    return YES;
+}
 - (void)handleSubmit {
     NSString *content = self.inputTextField.text;
     if (content.length == 0) {

+ 1 - 1
AICityProperty/AICity/JuXing/Views/JXShortDramaCell.m

@@ -246,7 +246,7 @@
     
     // 更新UI
     self.titleLabel.text = drama.title ?: @"未知标题";
-    self.descriptionLabel.text = drama.description ?: @"暂无描述";
+    self.descriptionLabel.text = drama.descriptions ?: @"暂无描述";
     
     // 更新交互数据
     [self updateLikeUI:drama.isLiked count:drama.likeCount];

+ 0 - 1
AICityProperty/AICity/Utils/GuestHelper.m

@@ -27,7 +27,6 @@
     
     if (user.token.length > 0) {
         // 已登录,直接执行操作
-        NSLog(@"[GuestHelper] User is logged in, executing action");
         if (action) {
             action();
         }

+ 19 - 0
AICityProperty/viewsNew/CommentFooterView.h

@@ -0,0 +1,19 @@
+//
+//  CommentFooterView.h
+//  AICity
+//
+//  Created by 张国栋 on 2025/10/22.
+//  Copyright © 2025 wei.z. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface CommentFooterView : UITableViewHeaderFooterView
+@property (weak, nonatomic) IBOutlet UIButton *btnOpen;
+
+@property (copy, nonatomic) void (^btnClicked)(void);
+@end
+
+NS_ASSUME_NONNULL_END

+ 26 - 0
AICityProperty/viewsNew/CommentFooterView.m

@@ -0,0 +1,26 @@
+//
+//  CommentFooterView.m
+//  AICity
+//
+//  Created by 张国栋 on 2025/10/22.
+//  Copyright © 2025 wei.z. All rights reserved.
+//
+
+#import "CommentFooterView.h"
+
+@implementation CommentFooterView
+
+/*
+// Only override drawRect: if you perform custom drawing.
+// An empty implementation adversely affects performance during animation.
+- (void)drawRect:(CGRect)rect {
+    // Drawing code
+}
+*/
+- (IBAction)btnClicked:(id)sender {
+    if (self.btnClicked) {
+        self.btnClicked();
+    }
+}
+
+@end

+ 63 - 0
AICityProperty/viewsNew/CommentFooterView.xib

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="24128" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24063"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="System colors in document resources" minToolsVersion="11.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <view contentMode="scaleToFill" id="iN0-l3-epB" customClass="CommentFooterView">
+            <rect key="frame" x="0.0" y="0.0" width="393" height="50"/>
+            <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+            <subviews>
+                <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="Fqw-Jl-v6b">
+                    <rect key="frame" x="16" y="24.666666666666668" width="20" height="1"/>
+                    <color key="backgroundColor" red="0.94509803921568625" green="0.94901960784313721" blue="0.95686274509803915" alpha="1" colorSpace="calibratedRGB"/>
+                    <constraints>
+                        <constraint firstAttribute="height" constant="1" id="n9a-kX-gsd"/>
+                        <constraint firstAttribute="width" constant="20" id="rRg-Kx-Y49"/>
+                    </constraints>
+                </view>
+                <button opaque="NO" contentMode="scaleToFill" semanticContentAttribute="forceRightToLeft" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="vXa-wE-olC">
+                    <rect key="frame" x="40" y="16.666666666666668" width="43" height="17.000000000000004"/>
+                    <fontDescription key="fontDescription" type="system" weight="medium" pointSize="14"/>
+                    <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                    <state key="normal" title="展开 " image="展开-1">
+                        <color key="titleColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
+                    </state>
+                    <state key="selected" title="收起 " image="展开-2"/>
+                    <connections>
+                        <action selector="btnClicked:" destination="iN0-l3-epB" eventType="touchUpInside" id="duc-6c-8gA"/>
+                    </connections>
+                </button>
+            </subviews>
+            <viewLayoutGuide key="safeArea" id="vUN-kp-3ea"/>
+            <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+            <constraints>
+                <constraint firstItem="Fqw-Jl-v6b" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="1NM-ZS-uA6"/>
+                <constraint firstItem="vXa-wE-olC" firstAttribute="centerY" secondItem="iN0-l3-epB" secondAttribute="centerY" id="77j-gs-qZS"/>
+                <constraint firstItem="Fqw-Jl-v6b" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="16" id="8yz-x1-mn1"/>
+                <constraint firstItem="vXa-wE-olC" firstAttribute="leading" secondItem="vUN-kp-3ea" secondAttribute="leading" constant="40" id="laf-N3-Iob"/>
+            </constraints>
+            <nil key="simulatedTopBarMetrics"/>
+            <nil key="simulatedBottomBarMetrics"/>
+            <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
+            <connections>
+                <outlet property="btnOpen" destination="vXa-wE-olC" id="G24-ku-G6C"/>
+            </connections>
+            <point key="canvasLocation" x="159.54198473282443" y="264.08450704225356"/>
+        </view>
+    </objects>
+    <resources>
+        <image name="展开-1" width="11" height="6.6666665077209473"/>
+        <image name="展开-2" width="11" height="7"/>
+        <systemColor name="systemBackgroundColor">
+            <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+        </systemColor>
+    </resources>
+</document>

+ 7 - 1
AICityProperty/viewsNew/CommentItemCell.h

@@ -11,7 +11,13 @@
 NS_ASSUME_NONNULL_BEGIN
 
 @interface CommentItemCell : UITableViewCell
-
+@property (weak, nonatomic) IBOutlet UILabel *labelT;
+@property (weak, nonatomic) IBOutlet UILabel *labelC;
+@property (weak, nonatomic) IBOutlet UILabel *labelTandD;
+@property (weak, nonatomic) IBOutlet UILabel *labelL;
+@property (weak, nonatomic) IBOutlet UIImageView *imgL;
+@property (copy, nonatomic) void (^likeClicked)(void);
+@property (copy, nonatomic) void (^huifuClicked)(void);
 @end
 
 NS_ASSUME_NONNULL_END

+ 10 - 0
AICityProperty/viewsNew/CommentItemCell.m

@@ -20,5 +20,15 @@
 
     // Configure the view for the selected state
 }
+- (IBAction)likeClicked:(id)sender {
+    if (self.likeClicked) {
+        self.likeClicked();
+    }
+}
+- (IBAction)huifu:(id)sender {
+    if (self.huifuClicked) {
+        self.huifuClicked();
+    }
+}
 
 @end

+ 13 - 0
AICityProperty/viewsNew/CommentItemCell.xib

@@ -60,6 +60,9 @@
                                         <state key="normal" title="回复">
                                             <color key="titleColor" red="0.40000000000000002" green="0.40000000000000002" blue="0.40000000000000002" alpha="1" colorSpace="calibratedRGB"/>
                                         </state>
+                                        <connections>
+                                            <action selector="huifu:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="V2Y-HQ-BrQ"/>
+                                        </connections>
                                     </button>
                                 </subviews>
                                 <constraints>
@@ -86,6 +89,9 @@
                                     <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="QiQ-cD-cxO">
                                         <rect key="frame" x="0.0" y="0.0" width="30" height="36.333333333333336"/>
                                         <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+                                        <connections>
+                                            <action selector="likeClicked:" destination="KGk-i7-Jjw" eventType="touchUpInside" id="NMv-kZ-jWL"/>
+                                        </connections>
                                     </button>
                                 </subviews>
                                 <color key="backgroundColor" systemColor="systemBackgroundColor"/>
@@ -124,6 +130,13 @@
                 </constraints>
             </tableViewCellContentView>
             <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <connections>
+                <outlet property="imgL" destination="TbO-Nc-aEg" id="x59-Ih-ZQ1"/>
+                <outlet property="labelC" destination="jkG-gx-8xT" id="eS5-I1-Dxu"/>
+                <outlet property="labelL" destination="mzR-Hp-DEl" id="kHA-X8-3aT"/>
+                <outlet property="labelT" destination="sPy-f2-aeY" id="8zL-2z-HZ0"/>
+                <outlet property="labelTandD" destination="xP1-6E-fGn" id="wHw-Ji-SvQ"/>
+            </connections>
             <point key="canvasLocation" x="199.23664122137404" y="121.47887323943662"/>
         </tableViewCell>
     </objects>

+ 17 - 0
AICityProperty/viewsNew/emptyTCell.h

@@ -0,0 +1,17 @@
+//
+//  emptyTCell.h
+//  AICity
+//
+//  Created by 张国栋 on 2025/10/22.
+//  Copyright © 2025 wei.z. All rights reserved.
+//
+
+#import <UIKit/UIKit.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+@interface emptyTCell : UITableViewCell
+
+@end
+
+NS_ASSUME_NONNULL_END

+ 24 - 0
AICityProperty/viewsNew/emptyTCell.m

@@ -0,0 +1,24 @@
+//
+//  emptyTCell.m
+//  AICity
+//
+//  Created by 张国栋 on 2025/10/22.
+//  Copyright © 2025 wei.z. All rights reserved.
+//
+
+#import "emptyTCell.h"
+
+@implementation emptyTCell
+
+- (void)awakeFromNib {
+    [super awakeFromNib];
+    // Initialization code
+}
+
+- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
+    [super setSelected:selected animated:animated];
+
+    // Configure the view for the selected state
+}
+
+@end

+ 24 - 0
AICityProperty/viewsNew/emptyTCell.xib

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.XIB" version="3.0" toolsVersion="24128" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES">
+    <device id="retina6_12" orientation="portrait" appearance="light"/>
+    <dependencies>
+        <deployment identifier="iOS"/>
+        <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="24063"/>
+        <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+        <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+    </dependencies>
+    <objects>
+        <placeholder placeholderIdentifier="IBFilesOwner" id="-1" userLabel="File's Owner"/>
+        <placeholder placeholderIdentifier="IBFirstResponder" id="-2" customClass="UIResponder"/>
+        <tableViewCell contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" rowHeight="377" id="KGk-i7-Jjw" customClass="emptyTCell">
+            <rect key="frame" x="0.0" y="0.0" width="320" height="377"/>
+            <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
+            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="KGk-i7-Jjw" id="H2p-sc-9uM">
+                <rect key="frame" x="0.0" y="0.0" width="320" height="377"/>
+                <autoresizingMask key="autoresizingMask"/>
+            </tableViewCellContentView>
+            <viewLayoutGuide key="safeArea" id="aW0-zy-SZf"/>
+            <point key="canvasLocation" x="96.18320610687023" y="98.943661971830991"/>
+        </tableViewCell>
+    </objects>
+</document>

+ 7 - 0
AICityProperty/viewsNew/videoItemsCell.h

@@ -12,6 +12,13 @@ NS_ASSUME_NONNULL_BEGIN
 
 @interface videoItemsCell : UICollectionViewCell
 @property (weak, nonatomic) IBOutlet EXTView *viewVIP;
+@property (weak, nonatomic) IBOutlet EXTButton *btnVIP;
+@property (copy, nonatomic) void (^vipClicked)(void);
+@property (copy, nonatomic) void (^playClicked)(void);
+@property (weak, nonatomic) IBOutlet UILabel *labelT;
+@property (weak, nonatomic) IBOutlet UILabel *labelTime;
+@property (weak, nonatomic) IBOutlet UILabel *labelView;
+@property (weak, nonatomic) IBOutlet EXTImageView *imgH;
 
 @end
 

+ 10 - 0
AICityProperty/viewsNew/videoItemsCell.m

@@ -17,5 +17,15 @@
     self.viewVIP.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMaxXMaxYCorner;
     
 }
+- (IBAction)playNow:(id)sender {
+    if (self.playClicked) {
+        self.playClicked();
+    }
+}
+- (IBAction)openVip:(id)sender {
+    if (self.vipClicked) {
+        self.vipClicked();
+    }
+}
 
 @end

+ 14 - 3
AICityProperty/viewsNew/videoItemsCell.xib

@@ -21,7 +21,7 @@
                     <view contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="ilp-Fi-vn7">
                         <rect key="frame" x="0.0" y="0.0" width="419" height="103"/>
                         <subviews>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9m9-Oc-f1f" customClass="EXTImageView">
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFill" horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="9m9-Oc-f1f" customClass="EXTImageView">
                                 <rect key="frame" x="15" y="17" width="122" height="69"/>
                                 <color key="backgroundColor" red="0.92941176470588238" green="0.92941176470588238" blue="0.92941176470588238" alpha="1" colorSpace="calibratedRGB"/>
                                 <constraints>
@@ -46,7 +46,7 @@
                                 <color key="textColor" red="0.6705882352941176" green="0.6705882352941176" blue="0.6705882352941176" alpha="1" colorSpace="calibratedRGB"/>
                                 <nil key="highlightedColor"/>
                             </label>
-                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="矩形 3" translatesAutoresizingMaskIntoConstraints="NO" id="PBI-61-Bi9">
+                            <imageView clipsSubviews="YES" userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" image="icon-2.2 1" translatesAutoresizingMaskIntoConstraints="NO" id="PBI-61-Bi9">
                                 <rect key="frame" x="203" y="66.666666666666671" width="15" height="15"/>
                                 <constraints>
                                     <constraint firstAttribute="height" constant="15" id="4ER-VR-mYd"/>
@@ -70,6 +70,9 @@
                                         <real key="value" value="14"/>
                                     </userDefinedRuntimeAttribute>
                                 </userDefinedRuntimeAttributes>
+                                <connections>
+                                    <action selector="playNow:" destination="gTV-IL-0wX" eventType="touchUpInside" id="4Hr-K3-JRm"/>
+                                </connections>
                             </button>
                             <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="Mbo-yr-6wA" customClass="EXTButton">
                                 <rect key="frame" x="328" y="60" width="76" height="28"/>
@@ -100,6 +103,9 @@
                                         <point key="value" x="1" y="0.5"/>
                                     </userDefinedRuntimeAttribute>
                                 </userDefinedRuntimeAttributes>
+                                <connections>
+                                    <action selector="openVip:" destination="gTV-IL-0wX" eventType="touchUpInside" id="7TN-JU-tY7"/>
+                                </connections>
                             </button>
                             <label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="1.3 万" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="bcw-Y9-N3e">
                                 <rect key="frame" x="223" y="67" width="29" height="14"/>
@@ -171,6 +177,11 @@
             </constraints>
             <size key="customSize" width="419" height="103"/>
             <connections>
+                <outlet property="btnVIP" destination="Mbo-yr-6wA" id="NX3-1x-cKy"/>
+                <outlet property="imgH" destination="9m9-Oc-f1f" id="j6j-z0-OMk"/>
+                <outlet property="labelT" destination="Ihs-D6-bK4" id="nlF-rh-Yq6"/>
+                <outlet property="labelTime" destination="vWM-50-CwE" id="SdJ-oN-mEw"/>
+                <outlet property="labelView" destination="bcw-Y9-N3e" id="gP6-uW-CoT"/>
                 <outlet property="viewVIP" destination="SDl-p7-SMc" id="bQG-e9-mBP"/>
             </connections>
             <point key="canvasLocation" x="9.9236641221374047" y="-120.07042253521128"/>
@@ -178,7 +189,7 @@
     </objects>
     <resources>
         <image name="VIP" width="17.666666030883789" height="9"/>
-        <image name="矩形 3" width="13" height="13"/>
+        <image name="icon-2.2 1" width="17" height="17"/>
         <systemColor name="systemBackgroundColor">
             <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
         </systemColor>