(八)BaseTableView的简单使用

2023-10-30

BaseTableView的简单使用

现在来说说另一个我封装比较重的UI组件。这个组件要实现什么效果呢?

当你使用继承了BaseTableView的子类tableView后,只需要在使用这个类的控制器中传递给tableView一个数据数组,并实现下拉刷新或者上拉加载的代理方法就可以了。你就自动实现了下拉刷新,上拉加载,以及刷新数据为空等的处理。

这样说可能比较笼统,我说说我的实现思路可能会便于理解。

一般来说使用tableView的地方我们都是加载一些数据,常用的就是下拉刷新和上拉加载。稍稍复杂些我们可能需要处理下比如上拉加载完成后的提示,以及下拉没有数据时的处理。下拉没有数据时展示的地方如果没有数据空白的一片可能体验不太好,所以我们可以添加一个图片或者提示告知用户没有数据。

#import <UIKit/UIKit.h>
@class BaseTableView;
/**
 *  下拉,上拉,选择的代理
 */
@protocol UITableViewEventDelegate <NSObject>

@optional
/**
 *  下拉刷新
 *
 *  @param tableView 传入的tableView
 */
- (void)pullDown:(BaseTableView *)tableView;
/**
 *  上拉加载
 *
 *  @param tableView 传入的tableView
 */
- (void)pullUp:(BaseTableView *)tableView;
/**
 *  选中cell的代理
 *
 *  @param tableView 传入的tableView
 *  @param indexPath 选中的坐标位置
 */
- (void)tableView:(BaseTableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;


@end
@interface BaseTableView : UITableView<UITableViewDelegate,UITableViewDataSource>
@property (nonatomic, assign)BOOL isDiyRefresh; // 是否自定义
@property (nonatomic,assign)BOOL isRefreshHeader;//是否需要下拉效果
@property (nonatomic,strong)NSArray *data;// 为tableView提供数据
@property (nonatomic,assign)id<UITableViewEventDelegate> eventDelegate;// 下拉,上拉事件代理
@property (nonatomic,assign)BOOL isMoreInfo;// 是否有更多数据,用来控制是否需要上拉加载功能
@property (nonatomic,strong)UILabel *footLabel;// 上拉加载时底部显示的标签提示
@property (nonatomic,assign)BOOL isNOData;// 没有数据

/**
 *  自定义的上拉
 *
 *
 */
- (id)initWithFrame:(CGRect)frame and:(BOOL)isDiyMoreRresh;
/**
 *  停止下拉刷新动画
 */
- (void)doneLoadingTableViewData;
/**
 *  滚动栏滚动到最底部
 *
 *  @param animated 是否开启动画
 */
- (void)scrollToBottomWithAnimated:(BOOL)animated;
#import "BaseTableView.h"
#import "MJRefresh.h"
#import "DiyRefreshHeader.h"
@interface BaseTableView()
{


    UILabel *_noDataLab;// 没有数据的提示
    UIImageView *_noDataImageV;// 没有数据的图片
    MJRefreshHeader *header;//下拉刷新的头文件

}

@end
@implementation BaseTableView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        self.dataSource = self;
        self.delegate = self;
        [self initView];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame and:(BOOL)isDiyMoreRresh
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        _isDiyRefresh = isDiyMoreRresh;
        self.dataSource = self;
        self.delegate = self;
        [self initView];
    }
    return self;
}
- (void)awakeFromNib
{
    [super awakeFromNib];
    self.dataSource = self;
    self.delegate = self;
    [self initView];
}
#pragma mark 懒加载一下data
- (NSArray *)data
{
    if (!_data) {
        _data = [NSArray array];
    }
    return _data;
}
- (void)initView
{

    // 设置回调(一旦进入刷新状态,就调用target的action,也就是调用self的loadNewData方法)
    header = [DiyRefreshHeader headerWithRefreshingTarget:self refreshingAction:@selector(pullDown)];

    //-----------------------上拉加载-----------------
    self.mj_footer = [MJRefreshAutoGifFooter footerWithRefreshingBlock:^{
        // 进入刷新状态后会自动调用这个block
        [self.eventDelegate pullUp:self];
    }];


    if (_isDiyRefresh) {
        MJRefreshAutoGifFooter *footer = [MJRefreshAutoGifFooter footerWithRefreshingTarget:self refreshingAction:@selector(pullUp)];

        footer.isDiyRefresh = _isDiyRefresh;

        NSMutableArray *imageArr = [NSMutableArray array];
        for (int i = 1; i<=24; i++) {
            UIImage *iamge = [UIImage imageNamed:[NSString stringWithFormat:@"%d",i]];
            [imageArr addObject:iamge];
        }

        [footer setImages:imageArr duration:1 forState:MJRefreshStateRefreshing];


        footer.refreshingTitleHidden = YES;

        self.mj_footer = footer;


    }else
    {
        MJRefreshAutoNormalFooter *footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(pullUp)];
        // 设置字体
        footer.isDiyRefresh = _isDiyRefresh;

        footer.stateLabel.font = [UIFont systemFontOfSize:14];

        // 设置颜色
        footer.stateLabel.textColor = [UIColor hexColor:@"F4F1F2"];
        footer.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;


        footer.refreshingTitleHidden = NO;

        self.mj_footer = footer;
    }

    //默认关闭上拉加载以及开启上拉刷新
    self.isMoreInfo = NO;
    self.refreshHeader = YES;

    self.separatorStyle = UITableViewCellSeparatorStyleNone;
}
#pragma mark 是否开启下拉刷新功能
- (void)setRefreshHeader:(BOOL)refreshHeader
{
    _isRefreshHeader = refreshHeader;
    if (_isRefreshHeader) {

        self.mj_header = header;
    }else{
        self.mj_header = nil;
    }
}

#pragma mark 隐藏或显示没有数据的提示图片
- (void)setIsNOData:(BOOL)isNOData
{
    _isNOData = isNOData;
    _isMoreInfo = NO;
    if (_isNOData) {

        [self initNoDataImage];
        _noDataImageV.hidden = NO;
        _noDataLab.hidden = NO;
        //将tableView上的数据清除并刷新
        self.data = @[];
        [self reloadData];

    }else
    {
        _noDataImageV.hidden = YES;
        _noDataLab.hidden = YES;

    }
}

#pragma mark 是否开启上拉加载动画
- (void)setIsMoreInfo:(BOOL)isMoreInfo
{
    _isMoreInfo = isMoreInfo;
    if (_isMoreInfo) {
        //显示上拉加载动画
        self.mj_footer.hidden = NO;
    }else
    {
        // 隐藏上拉加载动画
        self.mj_footer.hidden = YES;

    }
}





#pragma mark 关闭下拉加载
- (void)doneLoadingTableViewData{

    // 拿到当前的下拉刷新控件,结束刷新状态
    [self.mj_header endRefreshing];

    [self.mj_footer endRefreshing];
}




#pragma mark ----------------------UITableViewDelegate---------------------
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.data.count;
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    return nil;
}



#pragma mark - 初始化没有数据的图片
- (void)initNoDataImage
{

    if (_noDataImageV == nil || _noDataLab == nil)
    {
        _noDataImageV = [[UIImageView alloc] initWithFrame:CGRectZero];

        _noDataImageV.image = [UIImage imageNamed:@"空哒"];
        _noDataImageV.frame = CGRectMake((self.viewController.view.width-_noDataImageV.image.size.width)/2.0, (self.viewController.view.height-_noDataImageV.image.size.height)/2.0-48, _noDataImageV.image.size.width, _noDataImageV.image.size.height);
        _noDataImageV.hidden = YES;

        [self addSubview:_noDataImageV];

        _noDataLab = [[UILabel alloc]initWithFrame:CGRectMake((self.viewController.view.width-200)/2.0, _noDataImageV.bottom-30, 200, 100)];

        _noDataLab.text = @"空哒";
        _noDataLab.textAlignment = NSTextAlignmentCenter;
        _noDataLab.textColor = [UIColor colorWithHexString:@"bab4b8"];
        _noDataLab.font = [UIFont systemFontOfSize:13];
        _noDataLab.hidden = YES;

        [self addSubview:_noDataLab];
    }

}


#pragma mark 下拉刷新
- (void)pullDown
{
    // 2.模拟0.1秒后刷新表格UI(真实开发中,可以移除这段gcd代码),防止请求过快,看不到等待动画
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //停止加载,弹回下拉
        [self.eventDelegate pullDown:self];

    });

}


#pragma mark 上拉加载
- (void)pullUp
{
    // 2.模拟0.1秒后刷新表格UI(真实开发中,可以移除这段gcd代码),防止请求过快,看不到等待动画
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        //停止加载,弹回下拉
        [self.eventDelegate pullUp:self];

    });

}


#pragma mark - 滚动栏滚动到最底部
- (void)scrollToBottomWithAnimated:(BOOL)animated
{
    if ([self numberOfSections] > 0) {
        NSInteger lastSectionIndex = [self numberOfSections] - 1;
        NSInteger lastRowIndex = [self numberOfRowsInSection:lastSectionIndex] - 1;
        if (lastRowIndex > 0) {
            NSIndexPath *lastIndexPath = [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex];
            [self scrollToRowAtIndexPath:lastIndexPath atScrollPosition: UITableViewScrollPositionTop animated:animated];
        }
    }
}

#pragma mark - 滚动到顶部
- (void)scrollToTopWithAnimated:(BOOL)animated
{
    if ([self numberOfSections] > 0 && [self numberOfRowsInSection:0] > 0) {
        [self scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:animated];
    }
}

代码篇幅不多,也比较好理解,代码可在项目中的BaseTableView中查阅,我现在来说明下使用方法,看过后便大致知道方便的地方在哪了。

1. BaseTableView的引入

tableView基本页面中都会使用到,所以我便直接在BaseViewController中进行实现。使用继承自BaseViewController的控制器时同时也相当于实现了tableView。

在BaseViewController中实现协议UITableViewEventDelegate

@interface BaseViewController : UIViewController<RequestDataDelegate,UITableViewEventDelegate>

在BaseViewController定义一个baseTableView对象作为使用

@interface BaseViewController ()
{
    MBProgressHUD *hud; //!< hud第三方动画

    BaseTableView *_baseTableView;//!< 当子控制器用到baseTableView时,用此变量控制上拉下拉动画的结束
    BOOL _isPullDown;//!< 是否是下拉刷新
    //    BaseScrollView *_baseScrollView;//!< 当子控制器用到baseTableView时,用此变量控制上拉下拉动画的结束

    NSLayoutConstraint *hudBottomVToTopConstraint;//!<加载hud层距离顶部的距离
    NSLayoutConstraint *requestFailVToTopConstraint;//!<网络请求失败的view距离顶部的距离

    BOOL isCanReducePageNum;//是否可以减少pageNum在上拉失败时的页数

}

正如我在BaseViewController中介绍的,我这添加了上拉加载的计数器,所以每个方法中做了是上拉加载还是下拉刷新的判断。不论是上拉加载还是下拉刷新,我们都将代理传过来的tableView引用给ViewController中我们定义的baseTableView对象,方便我们在ViewController中网络请求成功或失败后关闭刷新动画。

这几个UITableViewEventDelegate协议的实现都只是简单做好网络前的准备,具体的实现我们需要对应不懂的子类ViewController中具体实现,现在可以操作第二步了。

2. 为tableView生成对应的cell和model

在homeViewController中进行实现,对应的文件夹下我们生产一个对应继承自baseTableView的HomeTable.
这里写图片描述

每个tableView展示的内容都是不一样的,所以我们需要与之对应的cell界面以及对应在cell中展示的数据model,Mode的详解后面说明,先参照项目代码完成tableView的数据展示

这里写图片描述

这里写图片描述

这里写图片描述

我们需要在HomeTable中实现的就是将获取到的数据赋予我们对应的cell,cell进行数据的展示,如果需要实现点击对应的栏跳跃到下一个界面,我么也可以直接在此实现tableView中的didSelectRowAtIndexPath方法。
这里写图片描述

这里写图片描述

最终生成结果如下
这里写图片描述

3. 模拟下拉刷新和上拉加载

因为暂时还没说到数据mod以及网络请求的封装,所以我们这暂时不做真实的网络请求,只简单的模拟下网络请求开始,失败以及结束的不同情况实现。

在homeViewController的控制器中拖动一个homeTableView类型的组件
这里写图片描述

代码内实现参见项目代码

#import "HomeViewController.h"
#import "HomeTable.h"
#import "HomeModel.h"
@interface HomeViewController ()
@property (weak, nonatomic) IBOutlet HomeTable *tableView;

@end

@implementation HomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.title = @"首页";

    //1.实现requestDataDelegate网络请求的几个个基本协议requestData,requestDataAgain
    //2.实现UITableViewEventDelegate的协议,将tableView传递给父类
    //3.在下拉刷新里面调用网络请求requestData

    [self requestData];

}

#pragma mark -------------------------requestDataDelegate-------------------------


#pragma mark 请求网路
- (void)requestData
{
    [super requestData];

    NSMutableArray *muArray = [NSMutableArray array];
    //做一个假的数据数组
    for(int i = 0; i<20; i++){
        HomeModel *model = [[HomeModel alloc]init];
        model.name = [NSString stringWithFormat:@"王%d",i];
        model.school = [NSString stringWithFormat:@"第%d中学",i];
        [muArray addObject:model];
    }


    //延迟3s模拟网络请求过程
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        //将请求获取到的值赋予tableView并刷新,并设置此类为代理
        self.tableView.data = muArray;
        self.tableView.eventDelegate = self;
        [self.tableView reloadData];

        //如果需要实现上拉加载,则只需要
        //self.tableView.isMoreInfo = true;
        //当我们判断服务器还有数据可以加载时便可开启此开关


        //调用父类写好的网络请求成功方法requestSuccess
        //如果需要自定义请求成功后的处理则可在此类中覆盖requestSuccess,暂时不模拟网络失败的情况
        [self requestSuccess];

    });
}

#pragma mark 重新请求网络
- (void)requestDataAgain
{
    [super requestDataAgain];
    [self requestData];
}



#pragma mark--------------------------------UITableViewEventDelegate
#pragma mark 下拉刷新
- (void)pullDown:(BaseTableView *)tableView
{
    [super pullDown:self.tableView];
    [self requestData];
}

//#pragma mark 上拉加载 根据情况是否需要有上拉加载
//- (void)pullUp:(BaseTableView *)tableView
//{
//
//    [super pullUp:self.tableView];
//}

这次数据的展示基本可以看出如何实现mvc的分层了。

  1. 我们在ViewController中获取到数据并转化为model,如果需要处理数据我们在model中处理即可
  2. 将model值传递给tableView
  3. tableView自动将model给对应的cell,直接在cell中引用model值
  4. 关于一些tableView上的操作如跳转,删除等我们在tableView中进行实现

以上也可以看出ViewController成了中转站,在这里有model,有view,他的作用便只需要将对应的model给对应的view就行了,本身不再对数据和界面进行操作,要修改ui只需要进对应的storyboard中的控制器或者对应的cell的xib文件修改就行了。

操作上的处理也单独抽出来,和table有关的在tableView中处理,和cell有关的在cell中处理。

基本所有展示数据的界面都是这个套路,所以团队在实现时引用这种套路会非常的方便与统一。成员写的代码一看即懂,和自己写的都是一个模板样。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(八)BaseTableView的简单使用 的相关文章

  • 使用 tableView:moveRowAtIndexPath:toIndexPath: 方法后将新订单保存到核心数据

    我在 Swift iOS 应用程序中有一个 tableView 允许用户对行重新排序 点击 编辑 按钮 可以重新排序或删除行 然后重新点击 编辑 按钮 现在显示为 完成 以完成该过程 如果我只是使用 tableView moveRowAtI
  • Go 语言中切片的使用和理解

    切片与数组类似 但更强大和灵活 与数组一样 切片也用于在单个变量中存储相同类型的多个值 然而 与数组不同的是 切片的长度可以根据需要增长和缩小 在 Go 中 有几种创建切片的方法 使用 datatype values 格式 从数组创建切片
  • C 语言运算符详解

    C 语言中的运算符 运算符用于对变量和值进行操作 在下面的示例中 我们使用 运算符将两个值相加 int myNum 100 50 虽然 运算符通常用于将两个值相加 就像上面的示例一样 它还可以用于将变量和值相加 或者将变量和另一个变量相加
  • 如何禁用 tableView 中表列的重新排序?

    试图弄清楚如何禁用 javafx 2 中表列的重新排序 这是解决方案 tblView getColumns addListener new ListChangeListener Override public void onChanged
  • 调整TableView菜单按钮

    Problem TableView 的 setTableMenuButtonVisible 提供了一种更改表列的可见性的机制 然而 该功能还有很多不足之处 菜单应保持打开状态 我有 e G 15 个表格列 单击菜单打开 gt 单击列 gt
  • 如何在android中滚动tableview

    我有一个要滚动的表格视图 因为数据未显示完整
  • 更改 TableView 上 UISearchBars 的宽度

    我需要在我的 tableView 中创建两个 UISearchBar 我希望它们在桌子顶部的宽度相等 并排 我创建了两个 UISearchBar 出口 并为它们创建了属性和分配 我发现很难将它们都放置 我的意思是适合 视图中 我只看到一个搜
  • 使用导航栏时如何将值从 view2 返回到 view1

    我是 iPhone 开发新手 使用导航栏时 如何将字符串值从 view2 传递到 view1 通过使用pushviewcontroller 我可以将字符串值从view1到view2到view3到 但是当我使用导航栏的后退按钮返回到以前的视图
  • JavaFx 2 - TableView,返回所选项目

    我想从 TableView 中获取所选项目作为字符串 但它返回整个路径 在上图中 当我单击选择单元格时 我想要得到 Indicator selected is Shannon Entropy 当我得到 Indicator selected
  • 可扩展的TableView [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何按类别显示表格视图 并且单击一行
  • tableview图像内容选择颜色

    我的应用程序有一个带有图像和文本字段的表格视图 image 图像渲染为模板图像 浅灰色 文本字段 文本颜色黑色 如果我选择一行 两者的颜色都会完美地变为白色 问题 我将图像更改为蓝色图像 默认渲染 如果我现在选择一行 文本字段的文本颜色将更
  • iOS 自定义表格视图单元格在编辑模式下调整大小

    编辑时UITableView红色圆形按钮和删除按钮与自定义单元格重叠 我们如何调整自定义单元格的大小 为红色圆形按钮和删除按钮留出空间 使用此代码 您可以根据编辑单元格的方式和所处阶段来执行不同的任务 我对代码进行了大量注释 因为我花了很长
  • 领域日期查询

    在我的 RealmSwift 0 92 3 Xcode6 3 下 我会如何 the Realm Object Definition import RealmSwift class NameEntry Object dynamic var p
  • 使用 Swift 以编程方式将文本标签和按钮添加到动态表格视图单元格

    我有一个动态表格视图和一个显示数组的原型单元格 我的问题是如何在单元格左侧添加一个在每个单元格上显示不同名称的按钮 然后在右侧添加一个显示数组信息的标签 谢谢 D 想象一下这是下面的单元格 左侧 Button 数组信息 右侧 TextLab
  • javafx.scene.control.TableColumn 无法转换为 javafx.scene.control.TableColumn$CellDataFeatures

    我在填充 javafx tableview 时遇到问题 我目前正在开发一个基于 GUI 的事件管理工具 适用于大学 并且我一直在尝试填充 Tableview 列表 该列表应该位于边框窗格布局的中心 这是我的代码 它很长的想法 它的主窗口函数
  • 如何在表格视图单元格滑动操作中设置清晰的背景?

    我在 UITableViewCell 中有一个 TrailingSwipeAction 其背景颜色必须清晰 这是我设置操作的代码 func tableView tableView UITableView trailingSwipeActio
  • [self.tableview reloadData];导致闪烁

    问题是 UI 出现然后更新 产生闪烁效果 我希望 UI 仅在用户进入应用程序时更新一次 因此我在 ViewDidLoad 中重新加载 这是代码 任何帮助如何消除这种闪烁 一些代码示例会有所帮助 void viewDidLoad super
  • JavaFX Span Tableview 通过 MapEntries 合并单元格

    你好 我有以下地图 Map
  • Swift - 在 TableView 单元格中使用步进器递增标签

    这里又是一个 Swift 初学者 我只是想在每个 TableView 单元格中使用一个步进器来增加同一单元格中的标签 我发现了关于这个主题的几个问题 但它们包含其他元素 我无法提取基本概念 Swift Stepper Action 更改同一
  • 在 JavaFX 中搜索 TableView 列表

    如何在 TableWie 中查找记录 例如通过 ID 并选择创建的行并将其放在 Java 8 JavaFX 中的屏幕中间 您可以使用以下方式搜索元素 int searchId table getItems stream filter ite

随机推荐

  • 网络协程编程

    一 背景 为什么需要网络协程 1 协程 纤程并不是一个新概念2 大并发 高性能对于服务端的高要求3 移动设备的快速增长加大了服务端大并发压力4 Go 语言的兴起将协程带到了一个新的高度支持协程的编程语言 1 Go 语言 非常容易支持大并发
  • Eigen入门之密集矩阵 1 -- 类Matrix介绍

    简介 本篇介绍Eigen中的Matrix类 在Eigen中 矩阵和向量的类型都用Matrix来表示 向量是一种特殊的矩阵 其只有一行或者一列 Matrix构造 在Matrix h中 定义了Matrix类 其中的构造器包括如下的5个 可以看到
  • python爬虫可以做什么呢?

    1 收集数据 Python爬虫程序可用于收集数据 这是最直接和最常用的方法 由于爬虫程序是一个程序 程序运行得非常快 不会因为重复的事情而感到疲倦 因此使用爬虫程序获取大量数据变得非常简单 快速 2 数据储存 Python爬虫可以将从各个网
  • 【防攻世界】misc解题思路-学习笔记

    前言 靶场地址 防攻世界 一 Cat falg 丢进 kali 或者其他Linux系统直接 cat flag 二 MeowMeow可爱的小猫 这道题就很离谱 flag需要用010工具打开 拉到最后就可以看到文字样式 组起来就是 CatCTF
  • 【深度学习】去掉softmax后Transformer会更好吗?复旦&华为诺亚提出SOFT:轻松搞定线性近似...

    作者丨happy 编辑丨极市平台 导读 本文介绍了复旦大学 华为诺亚提出的一种新颖的softmax free的Transformer SOFT 所提SOFT显著改善了现有ViT方案的计算效率 更为关键的是 SOFT的线性复杂度可以允许更长的
  • OPC UA 学习笔记 Event,Condition和Alarm

    告警和事件在自动控制领域十分重要 它是保障系统安全运营的主要措施 OPC UA 设立了专门的一部分来规范告警和条件模型 OPC 10000 9 UA Part 9 Alarms and Conditions 事件 条件和告警是OPCUA 信
  • 编程常用英语词汇(一)

    编程常用英语词汇 一 编程对英语的要求自不必说 这个技能是必须的 在平时开发和学习过程中 就算你不能完全读懂这句话的意思 如果你了解其中某个关键词的意思 也能大概猜到这句话的意思 这样的话也能对你解决问题提供很大的帮助 这就是我为什么要进行
  • Paperreading之三Simple Baselines for Human Pose Estimation

    本次paper是coco2018关键点检测项目的亚军方案 方法非常的简洁明了 但是效果很惊艳 达到了state of the art paper的标题也是写了simple baseline 整篇paper包含一个sota的姿态估计和姿态跟踪
  • setchecked方法会触发OnCheckedChangeListener

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 风趣幽默 还带黄段子 希望你也加入到我们人工智能的队伍中来 https blog csdn net jiangjunshow 转载请标明出处 http blog csdn net xx32
  • 模式识别机器学习PRML考前自测

    绪论 1 请介绍一下机器学习的整体框架 机器学习和模式识别基本一个东西 模式识别是工业界的称呼而已 机器学习是人工智能下属的子领域 用来辅助在大数据时代进行数据分析与数据管理 应用于数据挖掘工作 人工智能的其他子领域包括比如NLP CV等领
  • in module XXX. File is included in 4 contexts

    问题描述 整合SSM框架时 出现以下情况 原因分析 这四个配置文件应该位于同一个ApplicationContext下 解决方案
  • linux执行python程序实时重定向输出日志【-u参数】

    执行python程序的时候 不能实时输出 总是在执行完成之后再一次性的输出到日志中 对于长时间的 希望看到中间过程的情况 不是很方便 查了下是因为缓存的问题 u 表示不启用缓存 实时输出打印信息到日志文件 如果不加 u 则会导致日志文件不会
  • 框架到底是干什么用的?

    不用刻意地在设计中体现MVC 而是在不知不觉中写出符合优秀架构的代码 这应该是所有框架的共同目的 也应该是根本目的
  • 绝大部分人都理解错了HTTP中GET与POST的区别

    GET和POST是HTTP请求的两种基本方法 要说它们的区别 接触过WEB开发的人都能说出一二 最直观的区别就是GET把参数包含在URL中 POST通过request body传递参数 你可能自己写过无数个GET和POST请求 或者已经看过
  • keras神经网络入门:1.简单神经网络实现mnist识别,识别准确率高达89%

    第一步 导入相关模块 import tensorflow as tf from tensorflow keras import layers models from tensorflow keras datasets import mnis
  • 【深度学习】万字综述:用于深度神经网络加速的Shift操作

    作者丨科技猛兽 编辑丨极市平台 导读 如何同时满足减少可学习参数的数量以及维持computation memory access比值 你需要Shift操作 本文将详细介绍shift操作的具体方法 如何剪掉冗余的Shift操作 3种用于深度神
  • 【大模型系列 06】LLaMA-7B/13B for PyTorch 昇腾迁移

    源码链接 https gitee com ascend ModelZoo PyTorch tree master PyTorch built in foundation LLaMA 13B LLaMA 7B 13B for PyTorch
  • WIN10+Darknet自建简单数据集训练YOLOv3识别特定物体

    1 在darknet master build darknet x64 新建yolo obj cfg文件 可以直接复制yolov3 cfg 然后重命名为yolo obj cfg 然后就是修改这个文件内容了 将batch 改成64 batch
  • 类别不平衡

    类别不平衡产生原因 类别不平衡 class imbalance 是指分类任务中不同类别的训练样例数目差别很大的情况 产生原因 通常分类学习算法都会假设不同类别的训练样例数目基本相同 如果不同类别的训练样例数目差别很大 则会影响学习结果 测试
  • (八)BaseTableView的简单使用

    BaseTableView的简单使用 现在来说说另一个我封装比较重的UI组件 这个组件要实现什么效果呢 当你使用继承了BaseTableView的子类tableView后 只需要在使用这个类的控制器中传递给tableView一个数据数组 并