This commit is contained in:
2025-11-09 21:41:35 +08:00
parent 2415e97c97
commit 5e1a1f540e
9 changed files with 289 additions and 38 deletions

View File

@@ -70,10 +70,11 @@
048908EF2EBF861800FABA60 /* KBSkinSectionTitleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 048908EE2EBF861800FABA60 /* KBSkinSectionTitleCell.m */; };
048908F22EC047FD00FABA60 /* KBShopHeadView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048908F12EC047FD00FABA60 /* KBShopHeadView.m */; };
048908F52EC0496400FABA60 /* KBShopItemVC.m in Sources */ = {isa = PBXBuildFile; fileRef = 048908F42EC0496400FABA60 /* KBShopItemVC.m */; };
048908FE2EC0CC2400FABA60 /* UIScrollView+KBEmptyView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048908FD2EC0CC2400FABA60 /* UIScrollView+KBEmptyView.m */; };
048909F62EC0AAAA00FABA60 /* KBCategoryTitleCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */; };
048909F72EC0AAAA00FABA60 /* KBCategoryTitleView.m in Sources */ = {isa = PBXBuildFile; fileRef = 048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */; };
04890A042EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */; };
04890A052EC0BBBB00FABA60 /* KBCategoryTitleImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */; };
04890A042EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */; };
04890A052EC0BBBB00FABA60 /* KBCategoryTitleImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */; };
04A9FE0F2EB481100020DB6D /* KBHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 04FC97082EB31B14007BD342 /* KBHUD.m */; };
04A9FE132EB4D0D20020DB6D /* KBFullAccessManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 04A9FE112EB4D0D20020DB6D /* KBFullAccessManager.m */; };
04A9FE162EB873C80020DB6D /* UIViewController+Extension.m in Sources */ = {isa = PBXBuildFile; fileRef = 04A9FE152EB873C80020DB6D /* UIViewController+Extension.m */; };
@@ -252,14 +253,16 @@
048908F12EC047FD00FABA60 /* KBShopHeadView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBShopHeadView.m; sourceTree = "<group>"; };
048908F32EC0496400FABA60 /* KBShopItemVC.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBShopItemVC.h; sourceTree = "<group>"; };
048908F42EC0496400FABA60 /* KBShopItemVC.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBShopItemVC.m; sourceTree = "<group>"; };
048908FC2EC0CC2400FABA60 /* UIScrollView+KBEmptyView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "UIScrollView+KBEmptyView.h"; sourceTree = "<group>"; };
048908FD2EC0CC2400FABA60 /* UIScrollView+KBEmptyView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "UIScrollView+KBEmptyView.m"; sourceTree = "<group>"; };
048909F02EC0AAAA00FABA60 /* KBCategoryTitleCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleCell.h; sourceTree = "<group>"; };
048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleCell.m; sourceTree = "<group>"; };
048909F22EC0AAAA00FABA60 /* KBCategoryTitleView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleView.h; sourceTree = "<group>"; };
048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleView.m; sourceTree = "<group>"; };
04890A002EC0BBBB00FABA60 /* KBCategoryTitleImageCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleImageCell.h; sourceTree = "<group>"; };
04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleImageCell.m; sourceTree = "<group>"; };
04890A022EC0BBBB00FABA60 /* KBCategoryTitleImageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleImageView.h; sourceTree = "<group>"; };
04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleImageView.m; sourceTree = "<group>"; };
04890A002EC0BBBB00FABA60 /* KBCategoryTitleImageCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleImageCell.h; sourceTree = "<group>"; };
04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleImageCell.m; sourceTree = "<group>"; };
04890A022EC0BBBB00FABA60 /* KBCategoryTitleImageView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBCategoryTitleImageView.h; sourceTree = "<group>"; };
04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBCategoryTitleImageView.m; sourceTree = "<group>"; };
04A9A67D2EB9E1690023B8F4 /* KBResponderUtils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBResponderUtils.h; sourceTree = "<group>"; };
04A9FE102EB4D0D20020DB6D /* KBFullAccessManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KBFullAccessManager.h; sourceTree = "<group>"; };
04A9FE112EB4D0D20020DB6D /* KBFullAccessManager.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = KBFullAccessManager.m; sourceTree = "<group>"; };
@@ -506,10 +509,10 @@
048909F12EC0AAAA00FABA60 /* KBCategoryTitleCell.m */,
048909F22EC0AAAA00FABA60 /* KBCategoryTitleView.h */,
048909F32EC0AAAA00FABA60 /* KBCategoryTitleView.m */,
04890A002EC0BBBB00FABA60 /* KBCategoryTitleImageCell.h */,
04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */,
04890A022EC0BBBB00FABA60 /* KBCategoryTitleImageView.h */,
04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */,
04890A002EC0BBBB00FABA60 /* KBCategoryTitleImageCell.h */,
04890A012EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m */,
04890A022EC0BBBB00FABA60 /* KBCategoryTitleImageView.h */,
04890A032EC0BBBB00FABA60 /* KBCategoryTitleImageView.m */,
);
path = V;
sourceTree = "<group>";
@@ -883,6 +886,8 @@
04FC95D42EB1EA16007BD342 /* BaseCell.m */,
04FC95D52EB1EA16007BD342 /* BaseTableView.h */,
04FC95D62EB1EA16007BD342 /* BaseTableView.m */,
048908FC2EC0CC2400FABA60 /* UIScrollView+KBEmptyView.h */,
048908FD2EC0CC2400FABA60 /* UIScrollView+KBEmptyView.m */,
);
path = V;
sourceTree = "<group>";
@@ -1249,10 +1254,14 @@
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
inputPaths = (
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-keyBoard/Pods-keyBoard-frameworks.sh\"\n";
@@ -1316,8 +1325,8 @@
files = (
048909F62EC0AAAA00FABA60 /* KBCategoryTitleCell.m in Sources */,
048909F72EC0AAAA00FABA60 /* KBCategoryTitleView.m in Sources */,
04890A042EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m in Sources */,
04890A052EC0BBBB00FABA60 /* KBCategoryTitleImageView.m in Sources */,
04890A042EC0BBBB00FABA60 /* KBCategoryTitleImageCell.m in Sources */,
04890A052EC0BBBB00FABA60 /* KBCategoryTitleImageView.m in Sources */,
04FC95E92EB23B67007BD342 /* KBNetworkManager.m in Sources */,
04FC95D22EB1E7AE007BD342 /* MyVC.m in Sources */,
047C65582EBCC06D0035E841 /* HomeRankCardCell.m in Sources */,
@@ -1357,6 +1366,7 @@
04FC97062EB30A00007BD342 /* KBGuideUserCell.m in Sources */,
04FC97092EB31B14007BD342 /* KBHUD.m in Sources */,
04FC970E2EB334F8007BD342 /* UIImageView+KBWebImage.m in Sources */,
048908FE2EC0CC2400FABA60 /* UIScrollView+KBEmptyView.m in Sources */,
04FC970F2EB334F8007BD342 /* KBWebImageManager.m in Sources */,
04FC95CF2EB1E7A1007BD342 /* HomeVC.m in Sources */,
A1B2D7022EB8C00100000001 /* KBLangTestVC.m in Sources */,

View File

@@ -40,6 +40,22 @@ typedef void(^KBEmptyAction)(void);
/// 触发刷新空数据视图(若集成了 DZNEmptyDataSet 则调用其 reloadEmptyDataSet
- (void)kb_reloadEmptyDataSet;
/// 使用 LYEmptyView 在表格页快速挂载一套统一样式的空态视图(与 DZNEmptyDataSet 二选一)
/// 注意:调用该方法会自动关闭本类内置的 DZNEmptyDataSetuseEmptyDataSet = NO避免冲突。
/// - Parameters:
/// - image: 占位图(可空)
/// - title: 标题(默认“暂无数据”)
/// - detail: 描述(可空)
/// - buttonTitle: 按钮标题(可空,传空则不展示按钮)
/// - tapHandler: 点击空白区域回调(可空)
/// - buttonHandler: 按钮点击回调(可空)
- (void)kb_makeDefaultEmptyViewWithImage:(nullable UIImage *)image
title:(nullable NSString *)title
detail:(nullable NSString *)detail
buttonTitle:(nullable NSString *)buttonTitle
tapHandler:(nullable KBEmptyAction)tapHandler
buttonHandler:(nullable KBEmptyAction)buttonHandler;
@end
NS_ASSUME_NONNULL_END

View File

@@ -13,6 +13,15 @@
#define KB_HAS_DZN 0
#endif
// LYEmptyView Pod +
#if __has_include(<LYEmptyView/UIView+Empty.h>)
#import <LYEmptyView/UIView+Empty.h>
#import <LYEmptyView/LYEmptyView.h>
#define KB_HAS_LY 1
#else
#define KB_HAS_LY 0
#endif
@interface BaseTableView ()
#if KB_HAS_DZN
<DZNEmptyDataSetSource, DZNEmptyDataSetDelegate>
@@ -127,4 +136,66 @@
#endif
// MARK: - LYEmptyView DZN
- (void)kb_makeDefaultEmptyViewWithImage:(UIImage *)image
title:(NSString *)title
detail:(NSString *)detail
buttonTitle:(NSString *)buttonTitle
tapHandler:(KBEmptyAction)tapHandler
buttonHandler:(KBEmptyAction)buttonHandler {
#if KB_HAS_LY
// DZN
self.useEmptyDataSet = NO;
//
NSString *t = title ?: @"暂无数据";
LYEmptyView *ev = nil;
if (buttonTitle.length > 0) {
// block
__weak typeof(self) weakSelf = self;
ev = [LYEmptyView emptyActionViewWithImage:image
titleStr:t
detailStr:detail ?: @""
btnTitleStr:buttonTitle
btnClickBlock:^{ if (buttonHandler) buttonHandler(); [weakSelf setNeedsLayout]; }];
} else {
//
ev = [LYEmptyView emptyViewWithImage:image titleStr:t detailStr:detail ?: @""];
}
//
if (tapHandler) {
ev.tapEmptyViewBlock = ^{ tapHandler(); };
}
//
ev.emptyViewIsCompleteCoverSuperView = NO; //
ev.ignoreContentInset = YES; // inset/
ev.contentViewOffset = -10; //
ev.subViewMargin = 14; //
ev.titleLabFont = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold];
ev.titleLabTextColor = [UIColor colorWithWhite:0.45 alpha:1.0];
ev.detailLabFont = [UIFont systemFontOfSize:14];
ev.detailLabTextColor = [UIColor colorWithWhite:0.6 alpha:1.0];
ev.detailLabLineSpacing = 3;
ev.detailLabMaxLines = 2;
ev.actionBtnFont = [UIFont systemFontOfSize:15 weight:UIFontWeightSemibold];
ev.actionBtnCornerRadius = 6;
ev.actionBtnBorderWidth = 1;
ev.actionBtnBorderColor = [UIColor colorWithWhite:0.88 alpha:1.0];
ev.actionBtnTitleColor = [UIColor colorWithRed:0.22 green:0.49 blue:0.96 alpha:1.0];
ev.actionBtnBackGroundColor = [UIColor whiteColor];
ev.actionBtnHorizontalMargin = 20; // + padding*2
//
ev.autoShowEmptyView = NO;
self.ly_emptyView = (LYEmptyView *)ev;
#else
// LYEmptyView
(void)image; (void)title; (void)detail; (void)buttonTitle; (void)tapHandler; (void)buttonHandler;
#endif
}
@end

View File

@@ -0,0 +1,40 @@
//
// UIScrollView+KBEmptyView.h
// keyBoard
//
// 统一封装基于 LYEmptyView 的空态视图挂载方法,适用于 UITableView/UICollectionView。
// 注意:仅在对应页面已通过 CocoaPods 集成 LYEmptyView 时生效。
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
typedef void(^KBEmptyAction)(void);
@interface UIScrollView (KBEmptyView)
/// 快速挂载一套统一样式的空态视图LYEmptyView
/// - Parameters:
/// - image: 占位图(可空)
/// - title: 标题(默认“暂无数据”)
/// - detail: 描述(可空)
/// - buttonTitle: 按钮标题(可空,传空则不显示按钮)
/// - tapHandler: 点击空白区域回调(可空)
/// - buttonHandler: 按钮点击回调(可空)
- (void)kb_makeDefaultEmptyViewWithImage:(nullable UIImage *)image
title:(nullable NSString *)title
detail:(nullable NSString *)detail
buttonTitle:(nullable NSString *)buttonTitle
tapHandler:(nullable KBEmptyAction)tapHandler
buttonHandler:(nullable KBEmptyAction)buttonHandler;
/// 便捷加载态控制:关闭自动显隐后,配合网络请求手动控制显示/隐藏
- (void)kb_setLYAutoShowEnabled:(BOOL)enabled; // YES=自动显隐NO=手动
- (void)kb_beginLoadingForEmpty; // 请求开始:临时隐藏 empty
- (void)kb_endLoadingForEmpty; // 请求结束:根据数据源显示/隐藏(需确保先 reloadData
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,90 @@
//
// UIScrollView+KBEmptyView.m
// keyBoard
//
#import "UIScrollView+KBEmptyView.h"
#if __has_include(<LYEmptyView/UIView+Empty.h>)
#import <LYEmptyView/UIView+Empty.h>
#import <LYEmptyView/LYEmptyView.h>
#define KB_HAS_LY 1
#else
#define KB_HAS_LY 0
#endif
@implementation UIScrollView (KBEmptyView)
- (void)kb_makeDefaultEmptyViewWithImage:(UIImage *)image
title:(NSString *)title
detail:(NSString *)detail
buttonTitle:(NSString *)buttonTitle
tapHandler:(KBEmptyAction)tapHandler
buttonHandler:(KBEmptyAction)buttonHandler {
#if KB_HAS_LY
NSString *t = title ?: @"暂无数据";
LYEmptyView *ev = nil;
if (buttonTitle.length > 0) {
__weak typeof(self) weakSelf = self;
ev = [LYEmptyView emptyActionViewWithImage:image
titleStr:t
detailStr:detail ?: @""
btnTitleStr:buttonTitle
btnClickBlock:^{ if (buttonHandler) buttonHandler(); [weakSelf setNeedsLayout]; }];
} else {
ev = [LYEmptyView emptyViewWithImage:image titleStr:t detailStr:detail ?: @""];
}
if (tapHandler) { ev.tapEmptyViewBlock = ^{ tapHandler(); }; }
//
ev.emptyViewIsCompleteCoverSuperView = NO;
ev.ignoreContentInset = YES;
ev.contentViewOffset = -10;
ev.subViewMargin = 14;
ev.titleLabFont = [UIFont systemFontOfSize:16 weight:UIFontWeightSemibold];
ev.titleLabTextColor = [UIColor colorWithWhite:0.45 alpha:1.0];
ev.detailLabFont = [UIFont systemFontOfSize:14];
ev.detailLabTextColor = [UIColor colorWithWhite:0.6 alpha:1.0];
ev.detailLabLineSpacing = 3;
ev.detailLabMaxLines = 2;
ev.actionBtnFont = [UIFont systemFontOfSize:15 weight:UIFontWeightSemibold];
ev.actionBtnCornerRadius = 6;
ev.actionBtnBorderWidth = 1;
ev.actionBtnBorderColor = [UIColor colorWithWhite:0.88 alpha:1.0];
ev.actionBtnTitleColor = [UIColor colorWithRed:0.22 green:0.49 blue:0.96 alpha:1.0];
ev.actionBtnBackGroundColor = [UIColor whiteColor];
ev.actionBtnHorizontalMargin = 20;
// begin/end
ev.autoShowEmptyView = NO;
self.ly_emptyView = ev;
#else
(void)image; (void)title; (void)detail; (void)buttonTitle; (void)tapHandler; (void)buttonHandler;
#endif
}
- (void)kb_setLYAutoShowEnabled:(BOOL)enabled {
#if KB_HAS_LY
self.ly_emptyView.autoShowEmptyView = enabled;
#else
(void)enabled;
#endif
}
- (void)kb_beginLoadingForEmpty {
#if KB_HAS_LY
[self ly_startLoading];
#endif
}
- (void)kb_endLoadingForEmpty {
#if KB_HAS_LY
[self ly_endLoading];
#endif
}
@end

View File

@@ -1,14 +1,6 @@
//
// KBSkinDetailVC.m
// keyBoard
//
// UICollectionView
//
// - Section0
// - Section1 cell collectionView Cute/Fresh
// - Section2 cell Recommended Skin
// - Section3 2 使 KBSkinCardCell
//
#import "KBSkinDetailVC.h"
#import <Masonry/Masonry.h>

View File

@@ -2,17 +2,12 @@
// MySkinVC.m
// keyBoard
//
//
//
// - Editor/Cancel
// - CollectionView Masonry +
// - cell
// - bottomView >0 Delete #02BEAC
//
#import "MySkinVC.h"
#import <Masonry/Masonry.h>
#import "UIColor+Extension.h"
#import <MJRefresh/MJRefresh.h>
#import "UIScrollView+KBEmptyView.h" // LYEmptyView
#import "MySkinCell.h"
@@ -25,6 +20,7 @@ static NSString * const kMySkinCellId = @"kMySkinCellId";
@property (nonatomic, strong) UIButton *deleteButton; //
@property (nonatomic, strong) NSMutableArray<NSDictionary *> *data; //
@property (nonatomic, assign) NSInteger loadCount; // /
@property (nonatomic, assign, getter=isEditingMode) BOOL editingMode; //
@end
@@ -39,13 +35,8 @@ static NSString * const kMySkinCellId = @"kMySkinCellId";
// Editor/Cancel
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Editor" style:UIBarButtonItemStylePlain target:self action:@selector(onToggleEdit)];
//
self.data = [@[
@{ @"title": @"Dopamine" },
@{ @"title": @"Dopamine" },
@{ @"title": @"Dopamine" },
@{ @"title": @"Dopamine" },
] mutableCopy];
// +
self.data = [NSMutableArray array];
//
[self.view addSubview:self.collectionView];
@@ -63,10 +54,50 @@ static NSString * const kMySkinCellId = @"kMySkinCellId";
make.height.mas_equalTo(64);
}];
// LYEmptyView +
__weak typeof(self) weakSelf = self;
[self.collectionView kb_makeDefaultEmptyViewWithImage:nil
title:@"暂无皮肤"
detail:@"下拉刷新试试"
buttonTitle:@"重试"
tapHandler:nil
buttonHandler:^{ [weakSelf.collectionView.mj_header beginRefreshing]; }];
[self.collectionView kb_setLYAutoShowEnabled:NO]; //
//
[self.collectionView kb_endLoadingForEmpty];
// +
self.collectionView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(fetchData)];
//
[self.collectionView.mj_header beginRefreshing];
//
self.bottomView.hidden = YES;
}
#pragma mark - Data
- (void)fetchData {
// 1.0s
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
self.loadCount += 1;
// /
[self.data removeAllObjects];
if (self.loadCount % 2 == 0) {
for (int i = 0; i < 8; i++) {
[self.data addObject:@{ @"title": @"Dopamine" }];
}
}
[self.collectionView reloadData];
[self.collectionView kb_endLoadingForEmpty]; // / emptyView
[self.collectionView.mj_header endRefreshing];
});
}
#pragma mark - Actions
- (void)onToggleEdit {
@@ -112,6 +143,8 @@ static NSString * const kMySkinCellId = @"kMySkinCellId";
[self.collectionView deleteItemsAtIndexPaths:selected];
} completion:^(BOOL finished) {
[self updateBottomUI];
// 0
[self.collectionView kb_endLoadingForEmpty];
}];
}

View File

@@ -29,10 +29,10 @@
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// MySkinVC *vc = [[MySkinVC alloc] init];
KBSkinDetailVC *vc = [[KBSkinDetailVC alloc] init];
MySkinVC *vc = [[MySkinVC alloc] init];
// KBSkinDetailVC *vc = [[KBSkinDetailVC alloc] init];
// [self.navigationController pushViewController:vc animated:true];
[self.navigationController pushViewController:vc animated:true];
}
/*

View File

@@ -10,7 +10,6 @@
#import <Masonry/Masonry.h>
#import "KBSkinCardCell.h"
/// 使 UICollectionView KBSkinCardCell
@interface KBShopItemVC ()<UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>
@property (nonatomic, copy) void(^scrollCallback)(UIScrollView *scrollView);
@end