Commit 3695053385a3662325a65c616844f330eb932ea2
1 parent
54a0be3a
商品管理-搜索
Showing
18 changed files
with
1124 additions
and
4 deletions
Podfile
metaCode.xcodeproj/project.pbxproj
| ... | ... | @@ -69,6 +69,8 @@ |
| 69 | 69 | 1917335E2B328495007BCC04 /* CNLiveCouponListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1917335D2B328495007BCC04 /* CNLiveCouponListTableViewCell.swift */; }; |
| 70 | 70 | 191733602B352488007BCC04 /* CNLiveCouponGoodsListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1917335F2B352488007BCC04 /* CNLiveCouponGoodsListTableViewCell.swift */; }; |
| 71 | 71 | 191733622B3538DC007BCC04 /* CNLiveShopCouponsManagerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191733612B3538DC007BCC04 /* CNLiveShopCouponsManagerViewController.swift */; }; |
| 72 | + 191733642B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191733632B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift */; }; | |
| 73 | + 191733662B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 191733652B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift */; }; | |
| 72 | 74 | 192336EB2AD9224300D47CD4 /* CNUpSlideViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 192336EA2AD9224300D47CD4 /* CNUpSlideViewController.swift */; }; |
| 73 | 75 | 1926C28F2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1926C28E2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift */; }; |
| 74 | 76 | 1926C2912AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1926C2902AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift */; }; |
| ... | ... | @@ -103,6 +105,8 @@ |
| 103 | 105 | 19CC4D542ADD163D00308E2A /* CNUpSlideCardPresentationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D532ADD163D00308E2A /* CNUpSlideCardPresentationController.swift */; }; |
| 104 | 106 | 19CC4D562ADD19C200308E2A /* String+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19CC4D552ADD19C200308E2A /* String+Extension.swift */; }; |
| 105 | 107 | 19D2CE632AE8B65D00691757 /* CNLiveDownSlideTool.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */; }; |
| 108 | + 19E9D1602B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E9D15F2B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift */; }; | |
| 109 | + 19E9D1622B3BBB2E00D0FB30 /* CNLiveFileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19E9D1612B3BBB2E00D0FB30 /* CNLiveFileManager.swift */; }; | |
| 106 | 110 | 19F1C2332AB5728B0083D06C /* CNIDCardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */; }; |
| 107 | 111 | 19FA20172AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */; }; |
| 108 | 112 | 19FA20192AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */; }; |
| ... | ... | @@ -301,6 +305,8 @@ |
| 301 | 305 | 1917335D2B328495007BCC04 /* CNLiveCouponListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveCouponListTableViewCell.swift; sourceTree = "<group>"; }; |
| 302 | 306 | 1917335F2B352488007BCC04 /* CNLiveCouponGoodsListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveCouponGoodsListTableViewCell.swift; sourceTree = "<group>"; }; |
| 303 | 307 | 191733612B3538DC007BCC04 /* CNLiveShopCouponsManagerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopCouponsManagerViewController.swift; sourceTree = "<group>"; }; |
| 308 | + 191733632B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsSearchViewController.swift; sourceTree = "<group>"; }; | |
| 309 | + 191733652B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopGoodsManageListTableViewCell.swift; sourceTree = "<group>"; }; | |
| 304 | 310 | 192336EA2AD9224300D47CD4 /* CNUpSlideViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNUpSlideViewController.swift; sourceTree = "<group>"; }; |
| 305 | 311 | 1926C28E2AE0D76C00C71DC3 /* CNLiveDownSlideViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideViewModel.swift; sourceTree = "<group>"; }; |
| 306 | 312 | 1926C2902AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideModel.swift; sourceTree = "<group>"; }; |
| ... | ... | @@ -335,6 +341,8 @@ |
| 335 | 341 | 19CC4D532ADD163D00308E2A /* CNUpSlideCardPresentationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNUpSlideCardPresentationController.swift; sourceTree = "<group>"; }; |
| 336 | 342 | 19CC4D552ADD19C200308E2A /* String+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "String+Extension.swift"; sourceTree = "<group>"; }; |
| 337 | 343 | 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideTool.swift; sourceTree = "<group>"; }; |
| 344 | + 19E9D15F2B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveShopAssociatedGoodsTableViewCell.swift; sourceTree = "<group>"; }; | |
| 345 | + 19E9D1612B3BBB2E00D0FB30 /* CNLiveFileManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveFileManager.swift; sourceTree = "<group>"; }; | |
| 338 | 346 | 19F1C2322AB5728B0083D06C /* CNIDCardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNIDCardView.swift; sourceTree = "<group>"; }; |
| 339 | 347 | 19FA20162AE22D3C001F7186 /* CNLiveDownSlideRecommendCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideRecommendCell.swift; sourceTree = "<group>"; }; |
| 340 | 348 | 19FA20182AE22D98001F7186 /* CNLiveDownSlideTodayRecommendCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CNLiveDownSlideTodayRecommendCell.swift; sourceTree = "<group>"; }; |
| ... | ... | @@ -591,6 +599,7 @@ |
| 591 | 599 | children = ( |
| 592 | 600 | 19565EC42AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift */, |
| 593 | 601 | 19565EC62AF8AD38007D6727 /* CNLiveShopNewProductController.swift */, |
| 602 | + 191733632B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift */, | |
| 594 | 603 | 191732E42B05FFE8007BCC04 /* CNLiveModalPresentationViewController.swift */, |
| 595 | 604 | 1965FA412AFB79EA00F0F435 /* CNLiveGoodsCategoryController.swift */, |
| 596 | 605 | 191732EE2B075C3A007BCC04 /* CNLiveCreateShopClassifyViewController.swift */, |
| ... | ... | @@ -604,6 +613,8 @@ |
| 604 | 613 | children = ( |
| 605 | 614 | 19565ECC2AF8D256007D6727 /* CNLiveShopGoodsListClassifyView.swift */, |
| 606 | 615 | 19565ECE2AF8D8F6007D6727 /* CNLiveShopGoodsListCell.swift */, |
| 616 | + 191733652B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift */, | |
| 617 | + 19E9D15F2B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift */, | |
| 607 | 618 | 1965FA3D2AFB176E00F0F435 /* CNLiveShopAddGoodsSingleView.swift */, |
| 608 | 619 | 1965FA3F2AFB38AA00F0F435 /* CNLiveAddGoodsSelectUploadImageView.swift */, |
| 609 | 620 | 191733012B0C4EAB007BCC04 /* CNLiveSelUplSingleImageView.swift */, |
| ... | ... | @@ -664,6 +675,7 @@ |
| 664 | 675 | 19D2CE622AE8B65D00691757 /* CNLiveDownSlideTool.swift */, |
| 665 | 676 | 19BB202A2AF382150094D962 /* CNLiveAdaptTool.swift */, |
| 666 | 677 | 191733302B170537007BCC04 /* CNLiveCommonManager.swift */, |
| 678 | + 19E9D1612B3BBB2E00D0FB30 /* CNLiveFileManager.swift */, | |
| 667 | 679 | ); |
| 668 | 680 | path = Util; |
| 669 | 681 | sourceTree = "<group>"; |
| ... | ... | @@ -891,8 +903,8 @@ |
| 891 | 903 | 796398952A260C3700D045EB /* Supporting Files */ = { |
| 892 | 904 | isa = PBXGroup; |
| 893 | 905 | children = ( |
| 894 | - 818163C12A25CFCC00579C86 /* Main.storyboard */, | |
| 895 | 906 | 818163C42A25CFCF00579C86 /* Assets.xcassets */, |
| 907 | + 818163C12A25CFCC00579C86 /* Main.storyboard */, | |
| 896 | 908 | 818163C62A25CFCF00579C86 /* LaunchScreen.storyboard */, |
| 897 | 909 | ); |
| 898 | 910 | path = "Supporting Files"; |
| ... | ... | @@ -1057,8 +1069,8 @@ |
| 1057 | 1069 | 7CD675372A2740B0008354C1 /* CNUpSlideViewRemindView.swift */, |
| 1058 | 1070 | 7CD6753B2A2740B0008354C1 /* CNDownSlideView.swift */, |
| 1059 | 1071 | 7CD675382A2740B0008354C1 /* CNMainView.swift */, |
| 1060 | - 7CD675392A2740B0008354C1 /* CNUpSlideView.swift */, | |
| 1061 | 1072 | 7CD6753A2A2740B0008354C1 /* CNDownSlideViewRemindView.swift */, |
| 1073 | + 7CD675392A2740B0008354C1 /* CNUpSlideView.swift */, | |
| 1062 | 1074 | 7CD675412A2740F8008354C1 /* CNCustomIndexView.swift */, |
| 1063 | 1075 | 7C4931302A2F142F000E44B4 /* CNHomePageBackgroupView.swift */, |
| 1064 | 1076 | 7C4931372A307BDB000E44B4 /* CNHomePageGuideView.swift */, |
| ... | ... | @@ -1456,6 +1468,7 @@ |
| 1456 | 1468 | 1926C2912AE0FD4500C71DC3 /* CNLiveDownSlideModel.swift in Sources */, |
| 1457 | 1469 | 7C7C62F62A4D72E9007A912E /* CNLiveIdentityDB.swift in Sources */, |
| 1458 | 1470 | 19CC4D4F2ADD0FC200308E2A /* CNUpSlideDetailScrollView.swift in Sources */, |
| 1471 | + 191733642B392011007BCC04 /* CNLiveShopGoodsSearchViewController.swift in Sources */, | |
| 1459 | 1472 | 79EABB892AB4497700F3A4E2 /* CNLiveSaveStandDB.swift in Sources */, |
| 1460 | 1473 | 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */, |
| 1461 | 1474 | 19BB1FEA2AEF7B4A0094D962 /* CNLiveShopConsoleCell.swift in Sources */, |
| ... | ... | @@ -1475,6 +1488,7 @@ |
| 1475 | 1488 | 799172362AF08D4500DC01A8 /* CNLiveShopBaseModel.swift in Sources */, |
| 1476 | 1489 | 790B1FB62A41938F0074CF00 /* UIImage+CNLiveExtensions.swift in Sources */, |
| 1477 | 1490 | 790D019D2A2DCBD000C5978D /* UIView+CNLiveExtensions.swift in Sources */, |
| 1491 | + 19E9D1622B3BBB2E00D0FB30 /* CNLiveFileManager.swift in Sources */, | |
| 1478 | 1492 | 79E496E82AB9674300127BF8 /* NSMutableAttributedString+CNLiveExtensions.swift in Sources */, |
| 1479 | 1493 | 19CC4D472ADD006600308E2A /* CNDownSlideSingleCourseCell.swift in Sources */, |
| 1480 | 1494 | 191733232B14601A007BCC04 /* CNLivePlayerProgressSlider.swift in Sources */, |
| ... | ... | @@ -1485,6 +1499,7 @@ |
| 1485 | 1499 | 19565EC72AF8AD38007D6727 /* CNLiveShopNewProductController.swift in Sources */, |
| 1486 | 1500 | 798A44F72A3077ED00815935 /* CNLiveHotButton.swift in Sources */, |
| 1487 | 1501 | 7CD6753D2A2740B0008354C1 /* CNMainView.swift in Sources */, |
| 1502 | + 191733662B39237D007BCC04 /* CNLiveShopGoodsManageListTableViewCell.swift in Sources */, | |
| 1488 | 1503 | 793CAF522A58FCA200882EF4 /* CNLiveMineExchangeViewController.swift in Sources */, |
| 1489 | 1504 | 1917334E2B2C1A08007BCC04 /* CNLiveSelectCouponTapView.swift in Sources */, |
| 1490 | 1505 | 191733272B148BB1007BCC04 /* CNLivePlayerFastForwardPreviewView.swift in Sources */, |
| ... | ... | @@ -1537,6 +1552,7 @@ |
| 1537 | 1552 | 790D01A32A2DDBA300C5978D /* CNLiveConfigManager.swift in Sources */, |
| 1538 | 1553 | 19565EC52AF8AD1F007D6727 /* CNLiveShopProductManagerController.swift in Sources */, |
| 1539 | 1554 | 19CC4D492ADD06C500308E2A /* UITableView+Extension.swift in Sources */, |
| 1555 | + 19E9D1602B3A98C200D0FB30 /* CNLiveShopAssociatedGoodsTableViewCell.swift in Sources */, | |
| 1540 | 1556 | 191732CE2B04AACD007BCC04 /* CNLiveShopTextView.swift in Sources */, |
| 1541 | 1557 | 7C2703332A36CC660061EC50 /* CNLiveGlobalBlock.swift in Sources */, |
| 1542 | 1558 | 7987BF3D2A497644000A1ABC /* CNLiveMineQuestViewController.swift in Sources */, | ... | ... |
metaCode/Classes/Common/Base/CNLiveBaseNavigationController.swift
| ... | ... | @@ -7,7 +7,7 @@ |
| 7 | 7 | |
| 8 | 8 | import Foundation |
| 9 | 9 | |
| 10 | -class CNLiveBaseNavigationController : UINavigationController, UIGestureRecognizerDelegate,UINavigationControllerDelegate { | |
| 10 | +class CNLiveBaseNavigationController : UINavigationController,UINavigationControllerDelegate { | |
| 11 | 11 | |
| 12 | 12 | override func viewDidLoad() { |
| 13 | 13 | super.viewDidLoad() |
| ... | ... | @@ -26,7 +26,8 @@ class CNLiveBaseNavigationController : UINavigationController, UIGestureRecogniz |
| 26 | 26 | // MARK: - <UIGestureRecognizerDelegate> |
| 27 | 27 | // 什么时候调用:每次触发手势之前都会询问下代理,是否触发。 |
| 28 | 28 | // 作用:拦截手势触发,手势识别器对象会调用这个代理方法来决定手势是否有效 |
| 29 | - func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { | |
| 29 | + override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { | |
| 30 | + super.gestureRecognizerShouldBegin(gestureRecognizer) | |
| 30 | 31 | // if (gestureRecognizer == self.navigationController?.interactivePopGestureRecognizer) && (self.navigationController?.visibleViewController == self.navigationController?.viewControllers.first) { |
| 31 | 32 | // return false |
| 32 | 33 | // } | ... | ... |
metaCode/Classes/Config/CNLiveConfigManager.swift
| ... | ... | @@ -80,5 +80,7 @@ extension Notification.Name { |
| 80 | 80 | public static let kDSGoodsManageEditNotification = Notification.Name("kDSGoodsManageEditNotification") |
| 81 | 81 | //删除商品通知 |
| 82 | 82 | public static let kDSGoodsManageDeleteNotification = Notification.Name("kDSGoodsManageDeleteNotification") |
| 83 | + //搜索确认处理 | |
| 84 | + public static let kDSSelectGoodsNotification = Notification.Name("kDSSelectGoodsNotification") | |
| 83 | 85 | } |
| 84 | 86 | } | ... | ... |
metaCode/Classes/Main/HomePage/Controller/GoodsManager/CNLiveShopGoodsSearchViewController.swift
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveShopGoodsSearchViewController.swift | |
| 3 | +// metaCode | |
| 4 | +// | |
| 5 | +// Created by zx on 2023/12/25. | |
| 6 | +// | |
| 7 | + | |
| 8 | +import Foundation | |
| 9 | +import MJRefresh | |
| 10 | +import QMUIKit | |
| 11 | +enum CNSearchType{ | |
| 12 | + | |
| 13 | + /// 搜索普通商品类型 | |
| 14 | + case defaultGoods | |
| 15 | + /// 搜索关联商品类型 | |
| 16 | + case associateGoods | |
| 17 | +} | |
| 18 | + | |
| 19 | +class CNLiveShopGoodsSearchViewController:CNLiveBaseViewController,UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate{ | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + /// 搜索历史最大缓存数量 | |
| 24 | + let kCNLiveMaxCacheSearchKeywordKey = 30 | |
| 25 | + /// 历史记录本地缓存key | |
| 26 | + let kDSSaveShopSearchHistroyData = "kDSSaveShopSearchHistroyData" | |
| 27 | + /// 搜索关键字 | |
| 28 | + var keyWord:String? | |
| 29 | + var rightNavBtn:UIButton? | |
| 30 | + | |
| 31 | + lazy var tableView : UITableView = { | |
| 32 | + let tableView = UITableView(frame: CGRect(x: 0, y: KNavigationHeight, width: KSreenWidth, height: KSreenHeight-KNavigationHeight), style: .plain) | |
| 33 | + tableView.dataSource = self | |
| 34 | + tableView.delegate = self | |
| 35 | + tableView.backgroundColor = .white | |
| 36 | + tableView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom:getSystemTabbarUiOffsetHeight , right: 0) | |
| 37 | +// tableView.emptyDataSetSource = self | |
| 38 | +// tableView.emptyDataSetDelegate = self | |
| 39 | + tableView.separatorStyle = .none | |
| 40 | + tableView.tableFooterView = UIView.init() | |
| 41 | + tableView.tableHeaderView = self.cn_tableHeaderView() | |
| 42 | + tableView.mj_footer = MJRefreshAutoNormalFooter.init(refreshingBlock: {[weak self] in | |
| 43 | + self!.loadMoreAction() | |
| 44 | + }) | |
| 45 | + tableView.mj_footer?.isHidden = true | |
| 46 | + tableView.register(CNLiveShopGoodsManageListTableViewCell.self, forCellReuseIdentifier: kDSShopGoodsManageListTableViewCellID) | |
| 47 | + tableView.register(CNLiveShopAssociatedGoodsTableViewCell.self, forCellReuseIdentifier: kDSShopAssociatedGoodsTableViewCellID) | |
| 48 | + return tableView | |
| 49 | + }() | |
| 50 | + /// 搜索结果数据源 | |
| 51 | + lazy var dataArr: NSMutableArray = { | |
| 52 | + return NSMutableArray() | |
| 53 | + }() | |
| 54 | + /// 历史记录数据 | |
| 55 | + lazy var hisDataArr = { | |
| 56 | + return NSMutableArray() | |
| 57 | + }() | |
| 58 | + var searchTextField:UITextField? | |
| 59 | + /// 页码 | |
| 60 | + var page:Int = 0 | |
| 61 | + var searchType:CNSearchType = .defaultGoods | |
| 62 | + | |
| 63 | + /// 选中的关联商品 | |
| 64 | + var selectAssociatedGoodsModel:ShopOrderAssociatedGoodsModel? | |
| 65 | + | |
| 66 | + init(searchType:CNSearchType) { | |
| 67 | + super.init(nibName: nil, bundle: nil) | |
| 68 | + self.searchType = searchType | |
| 69 | + } | |
| 70 | + | |
| 71 | + required init?(coder: NSCoder) { | |
| 72 | + fatalError("init(coder:) has not been implemented") | |
| 73 | + } | |
| 74 | + | |
| 75 | + override func viewDidLoad() { | |
| 76 | + super.viewDidLoad() | |
| 77 | + self.view.backgroundColor = .white | |
| 78 | + navigationBarHidden = false | |
| 79 | + self.initTopNav() | |
| 80 | + self.view.addSubview(self.tableView) | |
| 81 | + } | |
| 82 | + | |
| 83 | + override func viewDidAppear(_ animated: Bool) { | |
| 84 | + super.viewDidAppear(animated) | |
| 85 | + self.searchTextField?.becomeFirstResponder() | |
| 86 | + self.popGestureRecognizerEnable = false | |
| 87 | + } | |
| 88 | + | |
| 89 | + override func viewDidDisappear(_ animated: Bool) { | |
| 90 | + super.viewDidDisappear(animated) | |
| 91 | + self.popGestureRecognizerEnable = true | |
| 92 | + } | |
| 93 | + | |
| 94 | + override func viewWillLayoutSubviews() { | |
| 95 | + super.viewWillLayoutSubviews() | |
| 96 | + self.tableView.frame = CGRect(x: 0, y: KNavigationHeight, width: KSreenWidth, height: self.view.height-KNavigationHeight) | |
| 97 | + | |
| 98 | + } | |
| 99 | + | |
| 100 | + // MARK: - initTopNav | |
| 101 | + func initTopNav(){ | |
| 102 | + let searchBgView = CNLiveRoundedRectView(frame: CGRect(x: 52, y: get_system_statusBar_height()+(get_system_nav_ui_height()-30)/2, width: self.topNavView.width-52*2, height: 30)) | |
| 103 | + searchBgView.fillColor = HexColor("#F2F2F2") | |
| 104 | + searchBgView.radius = searchBgView.height/2 | |
| 105 | + self.topNavView.addSubview(searchBgView) | |
| 106 | + | |
| 107 | + let searchImageView = UIImageView(frame: CGRect(x: 15, y: (searchBgView.height-16)/2, width: 16, height: 16)) | |
| 108 | + searchImageView.clipsToBounds = true | |
| 109 | + searchImageView.contentMode = .scaleAspectFit | |
| 110 | + searchImageView.image = UIImage(named: "DS_goods_search_icon") | |
| 111 | + searchBgView.addSubview(searchImageView) | |
| 112 | + | |
| 113 | + let searchLine = UIImageView(frame: CGRect(x: searchImageView.right+10, y: (searchBgView.height-11)/2, width: DS_RRV_ONE_PIXEL, height: 11)) | |
| 114 | + searchLine.backgroundColor = HexColor("#999999") | |
| 115 | + searchBgView.addSubview(searchLine) | |
| 116 | + | |
| 117 | + let searchTextField = UITextField(frame: CGRect(x: searchLine.right+10, y: 0, width: searchBgView.width-(searchLine.right+10+15), height: searchBgView.height)) | |
| 118 | + searchTextField.attributedPlaceholder = NSAttributedString(string: "请输你要搜索的商品", attributes: [.foregroundColor: HexColor("#D2D2D2")!]) | |
| 119 | + searchTextField.textColor = HexColor("#333333") | |
| 120 | + searchTextField.font = Font_13 | |
| 121 | + searchTextField.delegate = self | |
| 122 | + searchTextField.returnKeyType = .search | |
| 123 | + searchTextField.clearButtonMode = .whileEditing | |
| 124 | + searchBgView.addSubview(searchTextField) | |
| 125 | + self.searchTextField = searchTextField | |
| 126 | + searchTextField.addTarget(self, action: #selector(textFieldDidOnClearAndBecomeFirstResponder), for: .editingChanged) | |
| 127 | + | |
| 128 | + self.rightNavBtn = UIButton(type: .custom) | |
| 129 | + self.rightNavBtn?.setTitle("取消", for: .normal) | |
| 130 | + self.rightNavBtn?.frame = CGRect(x: 0, y: KStatusBarHeight, width: KNavigationHeight-KStatusBarHeight, height: KNavigationHeight-KStatusBarHeight) | |
| 131 | + self.rightNavBtn?.setTitleColor(HexColor("#ff725c"), for: .normal) | |
| 132 | + self.rightNavBtn?.addTarget(self, action: #selector(cancelNavBtnAction), for: .touchUpInside) | |
| 133 | + self.rightNavBtns = [self.rightNavBtn!] | |
| 134 | + | |
| 135 | + let leftNavBtn = UIButton(type: .custom) | |
| 136 | + leftNavBtn.setImage(UIImage(named: "DS_goods_search_back_icon"), for: .normal) | |
| 137 | + leftNavBtn.addTarget(self, action: #selector(rightNavBtnAction), for: .touchUpInside) | |
| 138 | + self.leftNavBtns = [leftNavBtn] | |
| 139 | + } | |
| 140 | + | |
| 141 | + // MARK: - UITableView 代理 | |
| 142 | + func numberOfSections(in tableView: UITableView) -> Int { | |
| 143 | + if (self.dataArr.count == 0) { | |
| 144 | + return 0 | |
| 145 | + } | |
| 146 | + return 1 | |
| 147 | + } | |
| 148 | + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { | |
| 149 | + return self.dataArr.count | |
| 150 | + } | |
| 151 | + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { | |
| 152 | + if self.searchType == .associateGoods{ | |
| 153 | + guard let cell = tableView.dequeueReusableCell(withIdentifier: kDSShopAssociatedGoodsTableViewCellID) as? CNLiveShopAssociatedGoodsTableViewCell | |
| 154 | + else { | |
| 155 | + let cell = CNLiveShopAssociatedGoodsTableViewCell() | |
| 156 | + return cell | |
| 157 | + } | |
| 158 | + let goodsModel = self.dataArr[indexPath.row] as! ShopOrderAssociatedGoodsModel | |
| 159 | + var isSelect = false | |
| 160 | + if goodsModel.id == self.selectAssociatedGoodsModel!.id{ | |
| 161 | + isSelect = true | |
| 162 | + } | |
| 163 | + cell.setModel(model: goodsModel, isSelect: isSelect, keyword: self.keyWord!) | |
| 164 | + return cell | |
| 165 | + }else{ | |
| 166 | + guard let cell = tableView.dequeueReusableCell(withIdentifier: kDSShopGoodsManageListTableViewCellID) as? CNLiveShopGoodsManageListTableViewCell | |
| 167 | + else { | |
| 168 | + let cell = CNLiveShopGoodsManageListTableViewCell() | |
| 169 | + return cell | |
| 170 | + } | |
| 171 | + cell.editCallBack = { model in | |
| 172 | + self.editGoodsModel(goodsModel: model) | |
| 173 | + } | |
| 174 | + cell.operStateCallBack = { model ,state in | |
| 175 | + self.operStateWithGoodsModel(goodsModel: model, state: state) | |
| 176 | + } | |
| 177 | + cell.editCountCallBack = { model in | |
| 178 | + self.editGoodsCountModel(goodsModel: model) | |
| 179 | + } | |
| 180 | + let model = self.dataArr[indexPath.row] as! ShopOrderAssociatedGoodsModel | |
| 181 | + cell.setSearchModel(model: model, keyWork: self.keyWord!) | |
| 182 | + return cell | |
| 183 | + } | |
| 184 | + } | |
| 185 | + func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { | |
| 186 | + let tempView = UIView(frame: CGRect(x: 0, y: 0, width: KSreenWidth, height: 50)) | |
| 187 | + tempView.backgroundColor = .white | |
| 188 | + if section == 1{ | |
| 189 | + tempView.height = 60 | |
| 190 | + let topView = UIView(frame: CGRect(x: 0, y: 0, width: KSreenWidth, height: 10)) | |
| 191 | + topView.backgroundColor = HexColor("#F9F9F9") | |
| 192 | + tempView.addSubview(topView) | |
| 193 | + } | |
| 194 | + | |
| 195 | + let nameLabel = UILabel(frame: CGRect(x: 10, y: 12 + (section == 1 ? 10 : 0), width: KSreenWidth - 90, height: 26)) | |
| 196 | + nameLabel.textColor = HexColor("#333333") | |
| 197 | + nameLabel.font = UIFont.boldSystemFont(ofSize: 16) | |
| 198 | + nameLabel.lineBreakMode = .byTruncatingTail | |
| 199 | + nameLabel.numberOfLines = 1 | |
| 200 | + nameLabel.text = String(format: "%@-商品", self.keyWord!) | |
| 201 | + tempView.addSubview(nameLabel) | |
| 202 | + | |
| 203 | + let lineLabel = UILabel(frame: CGRect(x: 10, y: 49 + (section == 1 ? 10 : 0), width: KSreenWidth - 20, height: DS_RRV_ONE_PIXEL)) | |
| 204 | + lineLabel.backgroundColor = HexColor("#F2F2F2") | |
| 205 | + tempView.addSubview(lineLabel) | |
| 206 | + | |
| 207 | + return tempView | |
| 208 | + } | |
| 209 | + | |
| 210 | + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { | |
| 211 | + switch self.searchType { | |
| 212 | + case .defaultGoods: | |
| 213 | + return 167//100 | |
| 214 | + case .associateGoods: | |
| 215 | + return 167 | |
| 216 | + } | |
| 217 | + } | |
| 218 | + func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { | |
| 219 | + return 50 | |
| 220 | + } | |
| 221 | + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { | |
| 222 | + let goodsModel = self.dataArr[indexPath.row] as! ShopOrderAssociatedGoodsModel | |
| 223 | + switch self.searchType { | |
| 224 | + case .defaultGoods: | |
| 225 | + let vc = CNLiveShopGoodsDetailsViewController() | |
| 226 | + vc.goodsId = goodsModel.id | |
| 227 | +// navigationViewController().pushViewController(vc, animated: pushAnimated) | |
| 228 | + break | |
| 229 | + case .associateGoods: | |
| 230 | + self.selectAssociatedGoodsModel = goodsModel | |
| 231 | + self.rightNavBtn?.setTitle("确认", for: .normal) | |
| 232 | + self.tableView.reloadData() | |
| 233 | + } | |
| 234 | + } | |
| 235 | + // MARK: - UIScrollViewDelegate | |
| 236 | + func scrollViewWillBeginDragging(_ scrollView: UIScrollView) { | |
| 237 | + self.view.endEditing(true) | |
| 238 | + } | |
| 239 | + | |
| 240 | + // MARK: - UITextFieldDelegate | |
| 241 | + func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { | |
| 242 | + if textField.tag == 666{ | |
| 243 | + let isAllow = (string as NSString).allowWriteString(string: "0123456789") | |
| 244 | + return !isAllow | |
| 245 | + } | |
| 246 | + return true | |
| 247 | + } | |
| 248 | + func textFieldDidEndEditing(_ textField: UITextField) { | |
| 249 | + if textField.text?.count ?? 0 > 20{ | |
| 250 | + textField.text = (textField.text! as NSString).substring(to: 20) | |
| 251 | + } | |
| 252 | + } | |
| 253 | + | |
| 254 | + func textFieldShouldReturn(_ textField: UITextField) -> Bool { | |
| 255 | + self.cn_skipGoodsListWithSearchKeyword(searchKeyword: textField.text ?? "") | |
| 256 | + return true | |
| 257 | + } | |
| 258 | + | |
| 259 | + @objc func textFieldShouldClear(_ textField: UITextField) -> Bool { | |
| 260 | + self.textFieldDidOnClearAndBecomeFirstResponder(textField: textField) | |
| 261 | + return true | |
| 262 | + } | |
| 263 | + @objc func textFieldDidOnClearAndBecomeFirstResponder(textField:UITextField){ | |
| 264 | + if textField.text?.count == 0{ | |
| 265 | + self.rightNavBtn?.setTitle("取消", for: .normal) | |
| 266 | + self.dataArr.removeAllObjects() | |
| 267 | + self.tableView.mj_footer?.isHidden = true | |
| 268 | + self.searchTextField?.text = "" | |
| 269 | + self.tableView.tableHeaderView = self.cn_tableHeaderView() | |
| 270 | + self.tableView.reloadData() | |
| 271 | + self.searchTextField?.becomeFirstResponder() | |
| 272 | + } | |
| 273 | + if textField.text?.count ?? 0 > 20{ | |
| 274 | + showMessage(message: "最长20个字!超出部分会在输入完成时自动删除") | |
| 275 | + } | |
| 276 | + } | |
| 277 | + // MARK: - response method | |
| 278 | + /// 点击历史记录 | |
| 279 | + /// @param button | |
| 280 | + @objc func hisBtnClick(_ button:UIButton){ | |
| 281 | + self.searchTextField?.text = button.titleLabel?.text | |
| 282 | + self.cn_skipGoodsListWithSearchKeyword(searchKeyword: button.titleLabel?.text ?? "") | |
| 283 | + } | |
| 284 | + | |
| 285 | + /// 删除历史记录 | |
| 286 | + @objc func deleteAllData(){ | |
| 287 | + CNLiveFileManager.shared.deleteKey(resetKey: kDSSaveShopSearchHistroyData) | |
| 288 | + self.tableView.tableHeaderView = self.cn_tableHeaderView() | |
| 289 | + self.tableView.reloadData() | |
| 290 | + | |
| 291 | + } | |
| 292 | + | |
| 293 | + /// 返回事件 | |
| 294 | + /// @param button 戳发按钮 | |
| 295 | + @objc func rightNavBtnAction(_ button:UIButton){ | |
| 296 | + navigationViewController().popViewController(animated: false) | |
| 297 | + } | |
| 298 | + | |
| 299 | + /// 取消或确认选中的搜索商品 事件 | |
| 300 | + /// @param button 戳发按钮 | |
| 301 | + @objc func cancelNavBtnAction(_ button:UIButton){ | |
| 302 | + if self.searchType == .associateGoods && self.selectAssociatedGoodsModel != nil{ | |
| 303 | + // 搜索确认处理 | |
| 304 | + NotificationCenter.default.post(name: Notification.Name.ShopGoodsManage.kDSSelectGoodsNotification, object: self.selectAssociatedGoodsModel) | |
| 305 | + let vcArray = self.navigationController?.viewControllers | |
| 306 | + for vc in vcArray!{ | |
| 307 | +// if vc.isKind(of: CNDSDarenReleaseDynamicViewController.self){ | |
| 308 | +// navigationViewController().popToViewController(vc, animated: true) | |
| 309 | +// return | |
| 310 | +// } | |
| 311 | + } | |
| 312 | + }else{ | |
| 313 | + self.navigationController?.popViewController(animated: true) | |
| 314 | + } | |
| 315 | + } | |
| 316 | + | |
| 317 | + func loadMoreAction(){ | |
| 318 | + self.page += 1 | |
| 319 | + self.requestSearchWordDataWithKeyword(keyword: self.keyWord!, page: self.page) | |
| 320 | + } | |
| 321 | + /// 编辑商品 | |
| 322 | + /// @param goodsModel 商品数据 | |
| 323 | + func editGoodsModel(goodsModel:ShopOrderAssociatedGoodsModel){ | |
| 324 | + let vc = CNLiveShopNewProductController() | |
| 325 | + vc.type = .edit | |
| 326 | + vc.goodsId = goodsModel.id! | |
| 327 | + navigationViewController().pushViewController(vc, animated: true) | |
| 328 | + } | |
| 329 | + | |
| 330 | + /// 编辑商品库存 | |
| 331 | + /// @param goodsModel 商品数据 | |
| 332 | + func editGoodsCountModel(goodsModel:ShopOrderAssociatedGoodsModel){ | |
| 333 | + let alert = UIAlertController(title: "编辑商品库存", message: "请输入库存数量", preferredStyle: .alert) | |
| 334 | + alert.addTextField { textField in | |
| 335 | + textField.delegate = self | |
| 336 | + textField.keyboardType = .numberPad | |
| 337 | + textField.returnKeyType = .done | |
| 338 | + textField.tag = 666 | |
| 339 | + } | |
| 340 | + alert.addAction(UIAlertAction(title: "取消", style: .cancel, handler: nil)) | |
| 341 | + | |
| 342 | + alert.addAction(UIAlertAction(title: "修改", style: .default, handler: { action in | |
| 343 | + self.view.endEditing(true) | |
| 344 | + let textField = alert.textFields?.first | |
| 345 | + if textField?.text?.count == 0 || textField?.text?.count ?? 0 >= 6{ | |
| 346 | + showMessage(message: "请输入有效的商品库存数量") | |
| 347 | + return | |
| 348 | + } | |
| 349 | + self.requsetEditGoodsCount(count: textField?.text ?? "", goodsModel: goodsModel) | |
| 350 | + })) | |
| 351 | + present(alert, animated: true, completion: nil) | |
| 352 | + } | |
| 353 | + | |
| 354 | + /// 编辑商品上下架状态 | |
| 355 | + /// @param goodsModel 商品数据 | |
| 356 | + /// @param state 1:上架 2:下架 | |
| 357 | + func operStateWithGoodsModel(goodsModel:ShopOrderAssociatedGoodsModel,state:Int){ | |
| 358 | + var message = "" | |
| 359 | + if (state == 2) { | |
| 360 | + message = "确认下架?" | |
| 361 | + }else { | |
| 362 | + message = "确认上架?" | |
| 363 | + } | |
| 364 | + ConfigAlertManager.shared.presentAlert(title: "", message: message, actionTitles: ["取消","确认"]) { index in | |
| 365 | + if index == 1 { | |
| 366 | + showLoading(message: "") | |
| 367 | + CNLiveShopGoodListViewModel.postChangeGoodsStateWithGoodsId(goodsId: goodsModel.id!, state: "") { result, status in | |
| 368 | + if status == .success{ | |
| 369 | + for (_,obj) in self.dataArr.enumerated(){ | |
| 370 | + let model = obj as! ShopOrderAssociatedGoodsModel | |
| 371 | + if model.id == goodsModel.id{ | |
| 372 | + if (model.state == "2") { | |
| 373 | + model.state = "1" | |
| 374 | + }else { | |
| 375 | + model.state = "2" | |
| 376 | + } | |
| 377 | + self.tableView.reloadData() | |
| 378 | + } | |
| 379 | + } | |
| 380 | + }else{ | |
| 381 | + showMessage(message: "失败") | |
| 382 | + return | |
| 383 | + } | |
| 384 | + } | |
| 385 | + } | |
| 386 | + } | |
| 387 | + } | |
| 388 | + // MARK: - 网络请求 | |
| 389 | + /// 搜索接口 | |
| 390 | + /// @param keyword 关键字 | |
| 391 | + func requestSearchWordDataWithKeyword(keyword:String,page:Int){ | |
| 392 | + showLoading(message: "") | |
| 393 | + CNLiveShopGoodListViewModel.getGetGoodsListWithShopId(shopId: DSUserInfoManager.shared.dsUserInfo.id, sortType: "1", state: 0, categoryId: nil, keyword: keyword, page: page) { result, status in | |
| 394 | + hiddenLoading() | |
| 395 | + if status == .success{ | |
| 396 | + let dataArr = result as! [ShopOrderAssociatedGoodsModel] | |
| 397 | + if (self.page == 1 && dataArr.count == 0) { | |
| 398 | + showMessage(message: "未搜索到相关结果") | |
| 399 | + self.dataArr.removeAllObjects() | |
| 400 | + self.tableView.tableHeaderView = self.cn_tableHeaderView() | |
| 401 | + self.tableView.reloadData() | |
| 402 | + self.rightNavBtn?.setTitle("取消", for: .normal) | |
| 403 | + self.searchTextField?.becomeFirstResponder() | |
| 404 | + }else{ | |
| 405 | + if (page == 1) { | |
| 406 | + self.dataArr.removeAllObjects() | |
| 407 | + self.tableView.mj_footer?.isHidden = false | |
| 408 | + } | |
| 409 | + | |
| 410 | + /**没有更多数据判断依据为:每页数据默认为20条,如果当前获取的这页数据小于20条,说明没有下页数据*/ | |
| 411 | + if (dataArr.count < 20) { | |
| 412 | + self.tableView.mj_footer?.isHidden = true | |
| 413 | + } | |
| 414 | + self.dataArr.addObjects(from: dataArr) | |
| 415 | + self.tableView.tableHeaderView = UIView() | |
| 416 | + self.tableView.reloadData() | |
| 417 | + } | |
| 418 | + }else{ | |
| 419 | + showMessage(message: "搜索失败") | |
| 420 | + } | |
| 421 | + } | |
| 422 | + } | |
| 423 | + /// 设置库存数 | |
| 424 | + /// @param count 库存数 | |
| 425 | + /// @param goodsModel 商品数据 | |
| 426 | + func requsetEditGoodsCount(count:String,goodsModel:ShopOrderAssociatedGoodsModel){ | |
| 427 | + showLoading(message: "") | |
| 428 | + CNLiveShopGoodListViewModel.postGoodsEditAttrWithShopId(shopId: DSUserInfoManager.shared.dsUserInfo.id!, goodsId: goodsModel.id!, type: 1, value: count) { result, status in | |
| 429 | + if status == .success{ | |
| 430 | + goodsModel.count = count | |
| 431 | + self.tableView.reloadData() | |
| 432 | + }else{ | |
| 433 | + showMessage(message: "操作失败") | |
| 434 | + } | |
| 435 | + } | |
| 436 | + } | |
| 437 | + | |
| 438 | + func cn_tableHeaderView() -> UIView{ | |
| 439 | + let headerView = UIView(frame: CGRect(x: 0, y: 0, width: KSreenWidth, height: 0)) | |
| 440 | + let whiteView = UIView(frame: CGRect(x: 0, y: 0, width: KSreenWidth, height: 0)) | |
| 441 | + whiteView.backgroundColor = .white | |
| 442 | + headerView.addSubview(whiteView) | |
| 443 | + | |
| 444 | + let markLab = UILabel(frame: CGRect(x: 25, y: 10, width: KSreenWidth-50, height: 30)) | |
| 445 | + markLab.textColor = HexColor("#898989") | |
| 446 | + markLab.text = "历史搜索" | |
| 447 | + markLab.font = Font_15 | |
| 448 | + whiteView.addSubview(markLab) | |
| 449 | + | |
| 450 | + self.hisDataArr.removeAllObjects() | |
| 451 | + if (CNLiveFileManager.shared.takeDataKey(key: kDSSaveShopSearchHistroyData)) != nil { | |
| 452 | + let arr = CNLiveFileManager.shared.takeDataKey(key: kDSSaveShopSearchHistroyData)! | |
| 453 | + self.hisDataArr.addObjects(from: arr) | |
| 454 | + } | |
| 455 | + if self.hisDataArr.count == 0{ | |
| 456 | + whiteView.height = markLab.bottom | |
| 457 | + headerView.height = whiteView.bottom + 5 | |
| 458 | + return whiteView | |
| 459 | + } | |
| 460 | + | |
| 461 | + let floatLayoutView = QMUIFloatLayoutView() | |
| 462 | + floatLayoutView.padding = UIEdgeInsets(top: 12, left: 12, bottom: 12, right: 12) | |
| 463 | + floatLayoutView.itemMargins = UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 10) | |
| 464 | + floatLayoutView.minimumItemSize = CGSizeMake(40, 29)// 以2个字的按钮作为最小宽度 | |
| 465 | + whiteView.addSubview(floatLayoutView) | |
| 466 | + | |
| 467 | + for i in 0..<self.hisDataArr.count{ | |
| 468 | + let button = UIButton(type: .custom) | |
| 469 | + button.backgroundColor = HexColor("#F9F9F9") | |
| 470 | + button.setTitleColor(HexColor("#666666"), for: .normal) | |
| 471 | + button.layer.cornerRadius = 5 | |
| 472 | + button.titleLabel?.lineBreakMode = .byTruncatingTail | |
| 473 | + button.setTitle(self.hisDataArr[i] as? String, for: .normal) | |
| 474 | + button.titleLabel?.font = Font_13 | |
| 475 | + button.contentEdgeInsets = UIEdgeInsets(top: 6, left: 10, bottom: 6, right: 10) | |
| 476 | + button.addTarget(self, action: #selector(hisBtnClick), for: .touchUpInside) | |
| 477 | + floatLayoutView.addSubview(button) | |
| 478 | + } | |
| 479 | + let padding = UIEdgeInsets(top: markLab.bottom, left: 10, bottom: 100, right: 10) | |
| 480 | + let contentWidth = whiteView.width - UIEdgeInsetsGetHorizontalValue(padding) | |
| 481 | + let floatLayoutViewSize = floatLayoutView.sizeThatFits(CGSize(width: contentWidth, height: CGFLOAT_MAX)) | |
| 482 | + floatLayoutView.frame = CGRect(x: padding.left, y: padding.top, width: contentWidth, height: floatLayoutViewSize.height) | |
| 483 | + | |
| 484 | + let lineView = UIView(frame: CGRect(x: 10, y: floatLayoutView.bottom, width: KSreenWidth-20, height: DS_RRV_ONE_PIXEL)) | |
| 485 | + lineView.backgroundColor = HexColor("#F2F2F2") | |
| 486 | + whiteView.addSubview(lineView) | |
| 487 | + | |
| 488 | + let deleteAllBtn = UIButton(type: .custom) | |
| 489 | + deleteAllBtn.frame = CGRect(x: 10, y: lineView.bottom+10, width: KSreenWidth-20, height: 30) | |
| 490 | + deleteAllBtn.addTarget(self, action: #selector(deleteAllData), for: .touchUpInside) | |
| 491 | + deleteAllBtn.titleLabel?.font = Font_15 | |
| 492 | + deleteAllBtn.setTitleColor(HexColor("#f5a623"), for: .normal) | |
| 493 | + deleteAllBtn.setTitle("清除搜索历史", for: .normal) | |
| 494 | + whiteView.addSubview(deleteAllBtn) | |
| 495 | + whiteView.height = deleteAllBtn.bottom+10 | |
| 496 | + headerView.height = whiteView.bottom+5 | |
| 497 | + return headerView | |
| 498 | + } | |
| 499 | + func cn_skipGoodsListWithSearchKeyword(searchKeyword:String){ | |
| 500 | + var searchKeywordStr = searchKeyword | |
| 501 | + let text = searchKeywordStr.replacingOccurrences(of: "\u{FFFC}", with: "") | |
| 502 | + //去除掉首尾的空白字符和换行字符 | |
| 503 | + searchKeywordStr = searchKeywordStr.trimmingCharacters(in: .whitespacesAndNewlines) | |
| 504 | + if (searchKeywordStr.isEmpty) { | |
| 505 | + showMessage(message: "搜索关键字不能为空") | |
| 506 | + return | |
| 507 | + } | |
| 508 | + self.view.endEditing(true) | |
| 509 | + if self.hisDataArr.contains(searchKeywordStr){ | |
| 510 | + self.hisDataArr.remove(searchKeywordStr) | |
| 511 | + } | |
| 512 | + self.hisDataArr.insert(searchKeyword, at: 0) | |
| 513 | + if self.hisDataArr.count > kCNLiveMaxCacheSearchKeywordKey{ | |
| 514 | + self.hisDataArr.removeObjects(in: NSMakeRange(kCNLiveMaxCacheSearchKeywordKey - 1, self.hisDataArr.count - (kCNLiveMaxCacheSearchKeywordKey - 1) - 1)) | |
| 515 | + } | |
| 516 | + CNLiveFileManager.shared.saveData(object: Array(self.hisDataArr), key: kDSSaveShopSearchHistroyData) | |
| 517 | + self.page = 1 | |
| 518 | + self.keyWord = searchKeywordStr | |
| 519 | + self.requestSearchWordDataWithKeyword(keyword: self.keyWord!, page: self.page) | |
| 520 | + | |
| 521 | + } | |
| 522 | +} | ... | ... |
metaCode/Classes/Main/HomePage/Controller/GoodsManager/CNLiveShopProductManagerController.swift
| ... | ... | @@ -89,6 +89,23 @@ class CNLiveShopProductManagerController:CNLiveBaseViewController, UITableViewDa |
| 89 | 89 | navigationBarHidden = false |
| 90 | 90 | titleName = "商品管理" |
| 91 | 91 | rightNavBtns = [self.addBtn] |
| 92 | + | |
| 93 | + let leftNavBtn = UIButton(type: .custom) | |
| 94 | + leftNavBtn.setImage(UIImage(named: "DS_goods_search_back_icon"), for: .normal) | |
| 95 | + leftNavBtn.addTarget(self, action: #selector(changeCancelAction), for: .touchUpInside) | |
| 96 | + leftNavBtn.width = 44 | |
| 97 | + leftNavBtn.height = 44 | |
| 98 | + | |
| 99 | + let leftSearchNavBtn = UIButton(type: .custom) | |
| 100 | + leftSearchNavBtn.setImage(UIImage(named: "DS_goods_manager_searchNav"), for: .normal) | |
| 101 | + leftSearchNavBtn.addTarget(self, action: #selector(searchBtnClick), for: .touchUpInside) | |
| 102 | + leftSearchNavBtn.width = 44 | |
| 103 | + leftSearchNavBtn.height = 44 | |
| 104 | + for btn in self.leftNavBtns{ | |
| 105 | + btn.removeFromSuperview() | |
| 106 | + } | |
| 107 | + self.leftNavBtns = [leftNavBtn,leftSearchNavBtn] | |
| 108 | + | |
| 92 | 109 | self.pageNum = 1 |
| 93 | 110 | self.view.addSubview(self.classifyView) |
| 94 | 111 | self.view.addSubview(tableView) |
| ... | ... | @@ -291,10 +308,16 @@ class CNLiveShopProductManagerController:CNLiveBaseViewController, UITableViewDa |
| 291 | 308 | |
| 292 | 309 | |
| 293 | 310 | // MARK: - BtnAction |
| 311 | + @objc func changeCancelAction() { | |
| 312 | + self.navigationController?.popViewController(animated: true) | |
| 313 | + } | |
| 294 | 314 | @objc func addBtnAction(){ |
| 295 | 315 | navigationViewController().pushViewController(CNLiveShopNewProductController(), animated: pushAnimated) |
| 296 | 316 | // currentViewController()?.navigationController?.pushViewController(CNLiveShopNewProductController(), animated: pushAnimated) |
| 297 | 317 | } |
| 318 | + @objc func searchBtnClick(){ | |
| 319 | + navigationViewController().pushViewController(CNLiveShopGoodsSearchViewController(searchType: .defaultGoods), animated: pushAnimated) | |
| 320 | + } | |
| 298 | 321 | |
| 299 | 322 | // MARK: - 商品编辑通知 |
| 300 | 323 | @objc func goodsManageAddNotification(notification:Notification) { | ... | ... |
metaCode/Classes/Main/HomePage/View/GoodsManager/CNLiveShopAssociatedGoodsTableViewCell.swift
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveShopAssociatedGoodsTableViewCell.swift | |
| 3 | +// metaCode | |
| 4 | +// | |
| 5 | +// Created by zx on 2023/12/26. | |
| 6 | +// | |
| 7 | + | |
| 8 | +import Foundation | |
| 9 | +let kDSShopAssociatedGoodsTableViewCellID = "kDSShopAssociatedGoodsTableViewCellID" | |
| 10 | +class CNLiveShopAssociatedGoodsTableViewCell:UITableViewCell{ | |
| 11 | + var model:ShopOrderAssociatedGoodsModel? | |
| 12 | + var isSelect:Bool = false | |
| 13 | + var goodsImageView:UIImageView? | |
| 14 | + var goodsTitleLab:UILabel? | |
| 15 | + var goodsTypeLab:UILabel? | |
| 16 | + var goodsPriceLab:UILabel? | |
| 17 | + var selectImageView:UIImageView? | |
| 18 | + var line:UIImageView? | |
| 19 | + | |
| 20 | + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { | |
| 21 | + super.init(style: style, reuseIdentifier: reuseIdentifier) | |
| 22 | + self.selectionStyle = .none | |
| 23 | + self.contentView.backgroundColor = .white | |
| 24 | + self.initUI() | |
| 25 | + } | |
| 26 | + | |
| 27 | + required init?(coder: NSCoder) { | |
| 28 | + fatalError("init(coder:) has not been implemented") | |
| 29 | + } | |
| 30 | + | |
| 31 | + // MARK: - initUI | |
| 32 | + func initUI(){ | |
| 33 | + self.selectionStyle = .none | |
| 34 | + let goodsImageView = UIImageView() | |
| 35 | + goodsImageView.clipsToBounds = true | |
| 36 | + goodsImageView.contentMode = .scaleAspectFill | |
| 37 | + self.goodsImageView = goodsImageView | |
| 38 | + self.addSubview(goodsImageView) | |
| 39 | + | |
| 40 | + let goodsTitleLab = UILabel() | |
| 41 | + goodsTitleLab.textColor = HexColor("#333333") | |
| 42 | + goodsTitleLab.font = UIFont.systemFont(ofSize: 15, weight: .regular) | |
| 43 | + self.goodsTitleLab = goodsTitleLab | |
| 44 | + self.addSubview(goodsTitleLab) | |
| 45 | + | |
| 46 | + let goodsTypeLab = UILabel() | |
| 47 | + goodsTypeLab.textColor = HexColor("#999999") | |
| 48 | + goodsTypeLab.font = UIFont.systemFont(ofSize: 13, weight: .light) | |
| 49 | + self.goodsTypeLab = goodsTypeLab | |
| 50 | + self.addSubview(goodsTypeLab) | |
| 51 | + | |
| 52 | + let goodsPriceLab = UILabel() | |
| 53 | + goodsPriceLab.textColor = HexColor("#FF3355") | |
| 54 | + goodsPriceLab.font = UIFont.systemFont(ofSize: 19, weight: .medium) | |
| 55 | + self.goodsPriceLab = goodsPriceLab | |
| 56 | + self.addSubview(goodsPriceLab) | |
| 57 | + | |
| 58 | + let selectImageView = UIImageView() | |
| 59 | + selectImageView.clipsToBounds = true | |
| 60 | + selectImageView.contentMode = .scaleAspectFit | |
| 61 | + self.selectImageView = selectImageView | |
| 62 | + self.addSubview(selectImageView) | |
| 63 | + | |
| 64 | + let line = UIImageView() | |
| 65 | + line.backgroundColor = HexColor("#e4e4e4") | |
| 66 | + self.line = line | |
| 67 | + self.addSubview(line) | |
| 68 | + } | |
| 69 | + | |
| 70 | + // MARK: - 赋值 | |
| 71 | + func setModel(model:ShopOrderAssociatedGoodsModel,isSelect:Bool){ | |
| 72 | + self.setModel(model: model, isSelect: isSelect, keyword: "") | |
| 73 | + } | |
| 74 | + func setModel(model:ShopOrderAssociatedGoodsModel,isSelect:Bool,keyword:String){ | |
| 75 | + self.model = model | |
| 76 | + self.isSelect = isSelect | |
| 77 | + self.goodsImageView?.kf.setImage(with: URL(string: self.model?.simg ?? "")) | |
| 78 | + let titleAtt = NSMutableAttributedString(string: self.model?.title ?? "") | |
| 79 | + if let range = self.model!.title!.range(of: keyword) { | |
| 80 | + titleAtt.addAttribute(.foregroundColor, value:HexColor("#FC1541")! as UIColor, range: NSRange(range, in: self.model!.title!)) | |
| 81 | + self.goodsTitleLab?.attributedText = titleAtt | |
| 82 | + self.goodsTypeLab?.text = self.model?.ads ?? "" | |
| 83 | + | |
| 84 | + var price = NSMutableAttributedString(string: String(format: "¥ %@", self.model?.price ?? "")) | |
| 85 | + price.addAttributes([NSAttributedString.Key.font:Font_13], range: NSRange(location: 0, length: 2)) | |
| 86 | + self.goodsPriceLab?.attributedText = price | |
| 87 | + | |
| 88 | + if self.isSelect{ | |
| 89 | + self.selectImageView?.image = UIImage(named: "DS_shop_AssGoods_select") | |
| 90 | + }else{ | |
| 91 | + self.selectImageView?.image = UIImage(named: "DS_shop_AssGoods_noselect") | |
| 92 | + } | |
| 93 | + } | |
| 94 | + } | |
| 95 | +} | ... | ... |
metaCode/Classes/Main/HomePage/View/GoodsManager/CNLiveShopGoodsManageListTableViewCell.swift
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveShopGoodsManageListTableViewCell.swift | |
| 3 | +// metaCode | |
| 4 | +// | |
| 5 | +// Created by zx on 2023/12/25. | |
| 6 | +// | |
| 7 | + | |
| 8 | +import Foundation | |
| 9 | +import Kingfisher | |
| 10 | +import SnapKit | |
| 11 | +/// 操作上下架回调 1上架 2下架 | |
| 12 | +typealias operStateCallBackBlock = (_ model:ShopOrderAssociatedGoodsModel , _ state:Int)->Void | |
| 13 | +/// 编辑商品回调 | |
| 14 | +typealias editCallBackBlock = (_ model:ShopOrderAssociatedGoodsModel)->Void | |
| 15 | +/// 编辑商品数量回调 | |
| 16 | +typealias editCountCallBackBlock = (_ model:ShopOrderAssociatedGoodsModel)->Void | |
| 17 | + | |
| 18 | +let kDSShopGoodsManageListTableViewCellID = "kDSShopGoodsManageListTableViewCellID" | |
| 19 | + | |
| 20 | +class CNLiveShopGoodsManageListTableViewCell:UITableViewCell{ | |
| 21 | + | |
| 22 | + var operStateCallBack:operStateCallBackBlock? | |
| 23 | + var editCallBack:editCallBackBlock? | |
| 24 | + var editCountCallBack:editCountCallBackBlock? | |
| 25 | + | |
| 26 | + var _model:ShopOrderAssociatedGoodsModel? | |
| 27 | + var model:ShopOrderAssociatedGoodsModel?{ | |
| 28 | + get{ | |
| 29 | + _model | |
| 30 | + } | |
| 31 | + set{ | |
| 32 | + _model = newValue | |
| 33 | + self.goodsImageView?.kf.setImage(with: URL(string: _model?.simg ?? "")) | |
| 34 | + self.goodsTitleLab?.text = _model?.title ?? "" | |
| 35 | + self.goodsTypeLab?.text = _model?.ads ?? "" | |
| 36 | + let price = NSMutableAttributedString(string: String(format: "¥ %@", _model?.price ?? "")) | |
| 37 | + price.addAttributes([NSAttributedString.Key.font: Font_13], range: NSRange(location: 0, length: 2)) | |
| 38 | + self.goodsPriceLab?.attributedText = price | |
| 39 | + if _model?.state == "2"{ | |
| 40 | + self.stateView?.selectIndex = 1 | |
| 41 | + }else{ | |
| 42 | + self.stateView?.selectIndex = 0 | |
| 43 | + } | |
| 44 | + self.countLab?.text = String(format: "库存:%@", _model?.count ?? "") | |
| 45 | + | |
| 46 | + } | |
| 47 | + } | |
| 48 | + | |
| 49 | + var goodsImageView:UIImageView? | |
| 50 | + var editBtn:UIButton? | |
| 51 | + var stateView:CNLiveSwitchView? | |
| 52 | + var goodsTitleLab:UILabel? | |
| 53 | + var goodsTypeLab:UILabel? | |
| 54 | + var goodsPriceLab:UILabel? | |
| 55 | + var line:UIImageView? | |
| 56 | + var countLab:UILabel? | |
| 57 | + var editCountBtn:UIButton? | |
| 58 | + var line1:UIImageView? | |
| 59 | + | |
| 60 | + required init?(coder: NSCoder) { | |
| 61 | + fatalError("init(coder:) has not been implemented") | |
| 62 | + } | |
| 63 | + | |
| 64 | + // MARK: - init | |
| 65 | + override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) { | |
| 66 | + super.init(style: style, reuseIdentifier: reuseIdentifier) | |
| 67 | + self.selectionStyle = .none | |
| 68 | + self.initUI() | |
| 69 | + } | |
| 70 | + | |
| 71 | + override func layoutSubviews() { | |
| 72 | + super.layoutSubviews() | |
| 73 | + self.goodsImageView?.frame = CGRect(x: 15, y: 15, width: 90, height: 90) | |
| 74 | + self.editBtn?.frame = CGRect(x: self.width - 15*2 - 28, y: 0, width: 15*2+28, height: 15*2+20) | |
| 75 | + self.goodsTitleLab?.frame = CGRect(x: self.goodsImageView!.right+15, y: 15, width: self.editBtn!.left - (self.goodsImageView!.right+15*2), height: 21) | |
| 76 | + self.goodsTypeLab?.frame = CGRect(x: self.goodsImageView!.right+15, y: self.goodsTitleLab!.bottom+5, width: self.width-(self.goodsImageView!.right+15*2), height: 18) | |
| 77 | + self.stateView?.frame = CGRect(x: self.width - 80 - 17, y: 0, width: 80, height: 20) | |
| 78 | + self.stateView?.radius = self.stateView!.height / 2 | |
| 79 | + self.goodsPriceLab?.frame = CGRect(x: self.goodsTypeLab!.left, y: self.goodsTypeLab!.bottom+19, width: self.stateView!.left-(self.goodsImageView!.right+15*2), height: 27) | |
| 80 | + self.goodsPriceLab?.snp.makeConstraints({ make in | |
| 81 | + make.left.equalTo(self.goodsTypeLab!.snp.left) | |
| 82 | + make.top.equalTo(self.goodsTypeLab!.snp.bottom).offset(19) | |
| 83 | + }) | |
| 84 | + self.stateView?.centerY = self.goodsPriceLab!.centerY | |
| 85 | + self.line?.frame = CGRect(x: 15, y: self.goodsImageView!.bottom+15, width: self.width-15*2, height: DS_RRV_ONE_PIXEL) | |
| 86 | + self.line1?.frame = CGRect(x: 0, y: self.height - 5, width: self.width, height: 5) | |
| 87 | + self.editCountBtn?.frame = CGRect(x: self.width-58-15, y: self.line!.bottom, width: 58, height: self.line1!.top-self.line!.bottom) | |
| 88 | + self.countLab?.frame = CGRect(x: 15, y: self.line!.bottom, width: self.editCountBtn!.left-15*2, height: self.line1!.top-self.line!.bottom) | |
| 89 | + | |
| 90 | + } | |
| 91 | + | |
| 92 | + // MARK: - initUI | |
| 93 | + func initUI(){ | |
| 94 | + self.goodsImageView = UIImageView() | |
| 95 | + self.goodsImageView?.clipsToBounds = true | |
| 96 | + self.goodsImageView?.contentMode = .scaleAspectFill | |
| 97 | + self.contentView.addSubview(self.goodsImageView!) | |
| 98 | + | |
| 99 | + self.goodsTitleLab = UILabel() | |
| 100 | + self.goodsTitleLab?.textColor = HexColor("#333333") | |
| 101 | + self.goodsTitleLab?.font = Font_15 | |
| 102 | + self.contentView.addSubview(self.goodsTitleLab!) | |
| 103 | + | |
| 104 | + self.goodsTypeLab = UILabel() | |
| 105 | + self.goodsTypeLab?.textColor = HexColor("#999999") | |
| 106 | + self.goodsTypeLab?.font = Font_13 | |
| 107 | + self.contentView.addSubview(self.goodsTypeLab!) | |
| 108 | + | |
| 109 | + self.goodsPriceLab = UILabel() | |
| 110 | + self.goodsPriceLab?.textColor = HexColor("#FF3355") | |
| 111 | + self.goodsPriceLab?.font = Font_19 | |
| 112 | + self.contentView.addSubview(self.goodsPriceLab!) | |
| 113 | + | |
| 114 | + self.editBtn = UIButton(type: .custom) | |
| 115 | + self.editBtn?.setTitle("编辑", for: .normal) | |
| 116 | + self.editBtn?.setTitleColor(HexColor("#666666"), for: .normal) | |
| 117 | + self.editBtn?.titleLabel?.font = Font_14 | |
| 118 | + self.editBtn?.addTarget(self, action: #selector(editBtnClick), for: .touchUpInside) | |
| 119 | + self.contentView.addSubview(self.editBtn!) | |
| 120 | + | |
| 121 | + self.stateView = CNLiveSwitchView() | |
| 122 | + self.stateView?.selectedBgColor = HexColor("#61C464") | |
| 123 | + self.stateView?.selectedTitleColor = HexColor("#FFFFFF") | |
| 124 | + self.stateView?.unselectedBgColor = HexColor("#F0F0F0") | |
| 125 | + self.stateView?.unselectedTitleColor = HexColor("#999999") | |
| 126 | + self.stateView?.titleFont = Font_11 | |
| 127 | + self.stateView?.titles = ["下架","上架"] | |
| 128 | + self.stateView?.switchBlock = { index in | |
| 129 | + var state = 0 | |
| 130 | + if index == 0{ | |
| 131 | + state = 2 | |
| 132 | + }else{ | |
| 133 | + state = 1 | |
| 134 | + } | |
| 135 | + self.operStateCallBack!(self.model!, state) | |
| 136 | + } | |
| 137 | + self.contentView.addSubview(self.stateView!) | |
| 138 | + | |
| 139 | + self.line = UIImageView() | |
| 140 | + self.line?.backgroundColor = HexColor("#e4e4e4") | |
| 141 | + self.contentView.addSubview(self.line!) | |
| 142 | + | |
| 143 | + self.countLab = UILabel() | |
| 144 | + self.countLab?.textColor = HexColor("#333333") | |
| 145 | + self.countLab?.font = Font_14 | |
| 146 | + self.contentView.addSubview(self.countLab!) | |
| 147 | + | |
| 148 | + self.editCountBtn = UIButton(type: .custom) | |
| 149 | + self.editCountBtn?.setTitle("编辑库存", for: .normal) | |
| 150 | + self.editCountBtn?.setTitleColor(HexColor("#61C464"), for: .normal) | |
| 151 | + self.editCountBtn?.titleLabel?.font = Font_14 | |
| 152 | + self.editCountBtn?.addTarget(self, action: #selector(editCountBtnClick), for: .touchUpInside) | |
| 153 | + self.contentView.addSubview(self.editCountBtn!) | |
| 154 | + | |
| 155 | + self.line1 = UIImageView() | |
| 156 | + self.line1?.backgroundColor = HexColor("#f9f9f9") | |
| 157 | + self.contentView.addSubview(self.line1!) | |
| 158 | + } | |
| 159 | + | |
| 160 | + // MARK: - 触发事件 | |
| 161 | + @objc func editBtnClick(){ | |
| 162 | + self.editCallBack!(self.model!) | |
| 163 | + } | |
| 164 | + | |
| 165 | + @objc func editCountBtnClick(){ | |
| 166 | + self.editCountCallBack!(self.model!) | |
| 167 | + } | |
| 168 | + | |
| 169 | + func setSearchModel(model:ShopOrderAssociatedGoodsModel,keyWork:String){ | |
| 170 | + self.model = model | |
| 171 | + if self.model?.title?.isEmpty == false{ | |
| 172 | + let titleString = NSMutableAttributedString(string: _model!.title!) | |
| 173 | + if let range = _model!.title!.range(of: keyWork) { | |
| 174 | + titleString.addAttribute(.foregroundColor, value:HexColor("#FC1541")! as UIColor, range: NSRange(range, in: _model!.title!)) | |
| 175 | + self.goodsTitleLab?.attributedText = titleString | |
| 176 | + } | |
| 177 | + }else{ | |
| 178 | + self.goodsTitleLab?.attributedText = NSMutableAttributedString(string: "") | |
| 179 | + } | |
| 180 | + self.goodsImageView?.kf.setImage(with: URL(string: self.model?.simg ?? "")) | |
| 181 | + self.goodsTypeLab?.text = self.model?.ads ?? "" | |
| 182 | + let price = NSMutableAttributedString(string: String(format: "¥ %@", self.model?.price ?? "")) | |
| 183 | + price.addAttributes([NSAttributedString.Key.font:Font_13], range: NSRange(location: 0, length: 2)) | |
| 184 | + self.goodsPriceLab?.attributedText = price | |
| 185 | + if self.model?.state == "2"{ | |
| 186 | + self.stateView?.selectIndex = 1 | |
| 187 | + }else{ | |
| 188 | + self.stateView?.selectIndex = 0 | |
| 189 | + } | |
| 190 | + self.countLab?.text = String(format: "库存:%@", self.model?.count ?? "") | |
| 191 | + } | |
| 192 | + | |
| 193 | + /// 获取字符串中与关键字匹配的所有位置 | |
| 194 | + /// @param str 字符串 | |
| 195 | + /// @param keyWork 关键字 | |
| 196 | + func cn_getRedRangStr(string:NSString,keyWork:NSString) -> Array<Any> | |
| 197 | + { | |
| 198 | + let array = NSMutableArray() | |
| 199 | + var str = string | |
| 200 | + var range = str.range(of: String(keyWork)) | |
| 201 | + while range.length>0{ | |
| 202 | + array.add(NSStringFromRange(range)) | |
| 203 | + if range.length>0{ | |
| 204 | + let mutableString = NSMutableString(capacity: keyWork.length) | |
| 205 | + for _ in 0..<keyWork.length { | |
| 206 | + mutableString.append(" ") | |
| 207 | + } | |
| 208 | + str = str.replacingCharacters(in: range, with: String(mutableString)) as NSString | |
| 209 | + } | |
| 210 | + range = str.range(of: keyWork as String) | |
| 211 | + } | |
| 212 | + return Array(array.copy() as! [Any]) | |
| 213 | + } | |
| 214 | +} | ... | ... |
metaCode/Classes/Main/Util/CNLiveFileManager.swift
0 → 100644
| 1 | +// | |
| 2 | +// CNLiveFileManager.swift | |
| 3 | +// metaCode | |
| 4 | +// | |
| 5 | +// Created by zx on 2023/12/27. | |
| 6 | +// | |
| 7 | + | |
| 8 | +import Foundation | |
| 9 | + | |
| 10 | +class CNLiveFileManager:NSObject{ | |
| 11 | + //单例类 | |
| 12 | + static let shared = CNLiveFileManager() | |
| 13 | + // MARK: - 属性 | |
| 14 | + /// 用户id 切换用户时会把当前用户存储路径指空 | |
| 15 | + var _userId:String? | |
| 16 | + var userId:String?{ | |
| 17 | + get{ | |
| 18 | + _userId | |
| 19 | + } | |
| 20 | + set{ | |
| 21 | + if _userId == newValue{ | |
| 22 | + self.useDSFileDir = "" | |
| 23 | + } | |
| 24 | + _userId = newValue | |
| 25 | + } | |
| 26 | + } | |
| 27 | + | |
| 28 | + // MARK: - 储存路径 | |
| 29 | + /// 存储路径 ~/Document/DS | |
| 30 | + var _dsFileDir:String? | |
| 31 | + var dsFileDir:String?{ | |
| 32 | + get{ | |
| 33 | + if _dsFileDir == nil{ | |
| 34 | + let path = String(format: "%@/Documents/metaCode/SearchGoods", NSHomeDirectory()) | |
| 35 | + let fileManager = FileManager.default | |
| 36 | + var isDir : ObjCBool = false | |
| 37 | + let exist = fileManager.fileExists(atPath: path, isDirectory: &isDir) | |
| 38 | + if !(isDir.boolValue && exist) { | |
| 39 | + do { | |
| 40 | + try fileManager.createDirectory(atPath: path, withIntermediateDirectories: true) | |
| 41 | + } catch { | |
| 42 | + debugPrint("文件目录创建失败") | |
| 43 | + return "" | |
| 44 | + } | |
| 45 | + } | |
| 46 | + _dsFileDir = path | |
| 47 | + } | |
| 48 | + return _dsFileDir | |
| 49 | + } | |
| 50 | + } | |
| 51 | + /// 当前用户储存路径 | |
| 52 | + /// 没userId ~/Document/DS/Common/ | |
| 53 | + /// 有userId ~/Document/DS/userId_XXX/ | |
| 54 | + // MARK: - 网络缓存 | |
| 55 | + private lazy var useDSFileDir: String = { | |
| 56 | + let userFileDir = NSString() | |
| 57 | + var path: String = "" | |
| 58 | + path = "\(dsFileDir!)/userId_\(DSUserInfoManager.shared.dsUserInfo.uid!)/" | |
| 59 | + let fileManager = FileManager.default | |
| 60 | + var isDir: ObjCBool = false | |
| 61 | + let exist: Bool = fileManager.fileExists(atPath: path, isDirectory: &isDir) | |
| 62 | + if !(isDir.boolValue && exist) { | |
| 63 | + do { | |
| 64 | + try fileManager.createDirectory(atPath: path, withIntermediateDirectories: true) | |
| 65 | + } catch { | |
| 66 | + debugPrint("文件目录创建失败") | |
| 67 | + return "" | |
| 68 | + } | |
| 69 | + } | |
| 70 | + return path as String | |
| 71 | + }() | |
| 72 | + | |
| 73 | + var _path:String? | |
| 74 | + var path:String?{ | |
| 75 | + get{ | |
| 76 | + String(format: "%@/storage.plist", self.useDSFileDir ) | |
| 77 | + } | |
| 78 | + } | |
| 79 | + | |
| 80 | + // MARK: - 存储、读取、删除 | |
| 81 | + /// write file 储存 | |
| 82 | + /// @param object 存储的对象 | |
| 83 | + /// @param key 存储对象的key | |
| 84 | + func saveData(object:Array<Any>,key:String){ | |
| 85 | + var dic = NSMutableDictionary(contentsOfFile: self.path!) | |
| 86 | + if dic == nil{ | |
| 87 | + dic = NSMutableDictionary() | |
| 88 | + } | |
| 89 | + dic?.setObject(object, forKey: key as NSCopying) | |
| 90 | + dic?.write(toFile: self.path!, atomically: true) | |
| 91 | + } | |
| 92 | + | |
| 93 | + /// write file 读取 | |
| 94 | + /// @param key 存储对象的key | |
| 95 | + func takeDataKey(key:String) -> Array<Any>?{ | |
| 96 | + var dic = NSMutableDictionary(contentsOfFile: self.path!) | |
| 97 | + if dic == nil{ | |
| 98 | + return nil | |
| 99 | + } | |
| 100 | + return dic![key] as? Array<Any> | |
| 101 | + } | |
| 102 | + /// 获取存储的所有数据 | |
| 103 | + func takeAllSaveData() -> NSDictionary?{ | |
| 104 | + var dic = NSMutableDictionary(contentsOfFile: self.path!) | |
| 105 | + if dic == nil{ | |
| 106 | + return nil | |
| 107 | + } | |
| 108 | + return dic! | |
| 109 | + } | |
| 110 | + /// 删除存储中所有的key | |
| 111 | + func resetAllSaveData(){ | |
| 112 | + var dic = NSMutableDictionary(contentsOfFile: self.path!) | |
| 113 | + if dic != nil{ | |
| 114 | + dic!.removeAllObjects() | |
| 115 | + dic!.write(toFile: self.path!, atomically: true) | |
| 116 | + } | |
| 117 | + } | |
| 118 | + /// 删除存储中对应的key | |
| 119 | + /// @param resetKey 删除的key | |
| 120 | + func deleteKey(resetKey:String){ | |
| 121 | + var dic = NSMutableDictionary(contentsOfFile: self.path!) | |
| 122 | + if dic != nil{ | |
| 123 | + dic!.removeObject(forKey: resetKey) | |
| 124 | + dic!.write(toFile: self.path!, atomically: true) | |
| 125 | + } | |
| 126 | + } | |
| 127 | + | |
| 128 | + /// 计算储存路径目录下所有文件大小 单位字节b | |
| 129 | + func calcDSFileDirCacheSize() -> CGFloat { | |
| 130 | + let fileManager = FileManager.default | |
| 131 | + var size: UInt64 = 0 | |
| 132 | + var isDir: ObjCBool = false | |
| 133 | + | |
| 134 | + do { | |
| 135 | + let directoryAttributes = try fileManager.attributesOfItem(atPath: self.dsFileDir!) | |
| 136 | + isDir = directoryAttributes[FileAttributeKey.type] as? ObjCBool ?? false | |
| 137 | + } catch { | |
| 138 | + print("Error getting attributes of directory: \(error)") | |
| 139 | + } | |
| 140 | + | |
| 141 | + if isDir.boolValue { | |
| 142 | + let fileList = try? fileManager.contentsOfDirectory(atPath: self.dsFileDir!) | |
| 143 | + for filePath in fileList ?? [] { | |
| 144 | + do { | |
| 145 | + let fileAttributes = try fileManager.attributesOfItem(atPath: (self.dsFileDir! as NSString).appendingPathComponent(filePath)) | |
| 146 | + size += fileAttributes[.size] as? UInt64 ?? 0 | |
| 147 | + } catch { | |
| 148 | + print("Error getting attributes of file: \(error)") | |
| 149 | + } | |
| 150 | + } | |
| 151 | + } else { | |
| 152 | + print("The path is not a directory.") | |
| 153 | + } | |
| 154 | + | |
| 155 | + return CGFloat(size) | |
| 156 | + } | |
| 157 | + | |
| 158 | + /// 清空储存路径缓存 | |
| 159 | + /// @param completion 清空完成回调 | |
| 160 | + func clearDSFileDirCacheCompletion(_ completion: @escaping () -> Void) { | |
| 161 | + DispatchQueue.global(qos: .userInitiated).async { | |
| 162 | + let fileManager = FileManager.default | |
| 163 | + let files = try? fileManager.contentsOfDirectory(atPath: self.dsFileDir!) | |
| 164 | + for file in files! { | |
| 165 | + let path = (self.dsFileDir! as NSString).appendingPathComponent(file) | |
| 166 | + do { | |
| 167 | + if FileManager.default.fileExists(atPath: path) { | |
| 168 | + try FileManager.default.removeItem(atPath: path) | |
| 169 | + } | |
| 170 | + } catch { | |
| 171 | + print("Error removing item at path: \(path), error: \(error)") | |
| 172 | + } | |
| 173 | + } | |
| 174 | + DispatchQueue.main.async { | |
| 175 | + completion() | |
| 176 | + } | |
| 177 | + } | |
| 178 | + } | |
| 179 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_manager_searchNav.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "DS_goods_manager_searchNav@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "DS_goods_manager_searchNav@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_manager_searchNav.imageset/DS_goods_manager_searchNav@2x.png
0 → 100644
906 Bytes
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_manager_searchNav.imageset/DS_goods_manager_searchNav@3x.png
0 → 100644
1.59 KB
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_search_back_icon.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "DS_goods_search_back_icon@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "DS_goods_search_back_icon@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_search_back_icon.imageset/DS_goods_search_back_icon@2x.png
0 → 100644
413 Bytes
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_search_back_icon.imageset/DS_goods_search_back_icon@3x.png
0 → 100644
1.36 KB
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_search_icon.imageset/Contents.json
0 → 100644
| 1 | +{ | |
| 2 | + "images" : [ | |
| 3 | + { | |
| 4 | + "idiom" : "universal", | |
| 5 | + "scale" : "1x" | |
| 6 | + }, | |
| 7 | + { | |
| 8 | + "filename" : "DS_goods_search_icon@2x.png", | |
| 9 | + "idiom" : "universal", | |
| 10 | + "scale" : "2x" | |
| 11 | + }, | |
| 12 | + { | |
| 13 | + "filename" : "DS_goods_search_icon@3x.png", | |
| 14 | + "idiom" : "universal", | |
| 15 | + "scale" : "3x" | |
| 16 | + } | |
| 17 | + ], | |
| 18 | + "info" : { | |
| 19 | + "author" : "xcode", | |
| 20 | + "version" : 1 | |
| 21 | + } | |
| 22 | +} | ... | ... |
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_search_icon.imageset/DS_goods_search_icon@2x.png
0 → 100644
806 Bytes
metaCode/Supporting Files/Assets.xcassets/Shop/DS_goods_search_icon.imageset/DS_goods_search_icon@3x.png
0 → 100644
1.49 KB