学生信息管理系统(cocos2d引擎)——数据结构课程设计
老师手把手教了两天半,看了一下模式,加了几个功能就大功告成了!!!
给我的感想就是全都是指针!
添加图片精灵:
CCSprite* spBG = CCSprite::create("");
this->addChild(spBG); //添加到当前层
spGB->setPosition(ccp(x,y)); //设置坐标
spGB->setScale(0.5); //缩放
文字按钮:
CCMenuItemFont* pItem = CCMenuItemFont::create("wenzi",this,menu_selector(回调函数));
再将文字按钮添加到菜单中
CCMenu* menu = CCMen::create(pItem,NULL);
this->addChild(menu);
menu->setPosition(ccp(x,y));
//创建文本
CCLabelTTF* ttf = CCLabelTTF::create("wenben","字体",48.0f);
this->addChild(ttf);
ttf->setPosition(cco(x,y));
//创建输入框(1、九点图,2、输入框)
CCScale9Sprite* input = CCScale9Sprite::create("");
accountBox = CCEditBox::create(CCSizeMake(r,c),input);
this->addChild(accounBox);
accountBox->setPosition(ccp(x,y));
accountBox->setInputFlag(kEditBoxInputFlagPassword); //输入模式为密码输入
按钮回调函数,看输入框accountBox的内容是否是密码;
不是密码:
弹出输入框 CCMessageBox("","");
是密码切换场景
CCDirector* director = CCDirector::sharedDirector();
director->replaceScene(ListViewLayer::scene()); //另一个头文件,里面的一个场景;
接下来,和之前的一样了;无非就是一些按钮,文本,输入框。
在init()里面画好面板;
各种按钮里面的回调函数。
然后中文转码utf-8老师已经写好了;
贴上自己写的东西,其他的老师已经写好了
#ifndef _Students_H_
#define _Students_H_
#include <iostream>
using namespace std;
class Students
{
public:
int m_iNumber;
char m_strName[];
char m_sex;
public:
Students(int iNumber, char* strName,char sex);
};
#endif
Students.h
#include "Students.h" Students::Students(int iNumber, char* strName,char sex)
{
m_iNumber = iNumber;
strcpy(m_strName, strName);
m_sex = sex;
}
Students.cpp
#ifndef _Manager_H_
#define _Manager_H_
#include <iostream>
using namespace std;
#include <vector>
#include "Students.h"
class Manager
{
private:
Manager();
public:
static Manager* m_pStance;
static Manager* getInstance(); // 管理学生容器
vector<Students*> _vStudent;
}; #endif
Manager.h
#include "Manager.h" Manager* Manager::m_pStance = NULL;
Manager* Manager::getInstance()
{
if(m_pStance == NULL)
{
m_pStance = new Manager;
}
return m_pStance;
} Manager::Manager()
{
Students* s = new Students(,"TreeDream",'F');
_vStudent.push_back(s);
s = new Students(,"马里奥", 'M');
_vStudent.push_back(s);
}
Manager.cpp
#ifndef __TABLEVIEWTESTSCENE_H__
#define __TABLEVIEWTESTSCENE_H__ #include "cocos2d.h"
#include "cocos-ext.h"
USING_NS_CC;
USING_NS_CC_EXT; #include "ChineseString.h"
#include "Manager.h" //需要实现CCTabelViewDelegate和CCTabelViewDataSource这两个接口
class ListViewLayer : public CCLayer,
public CCTableViewDataSource,
public CCTableViewDelegate
{
private:
CCTableView* pTableView;
vector<Students*>::iterator it; CCLabelTTF* ttf; //提示信息 // 添加对话框需要的UI
CCLayerColor* layerBg;
CCEditBox* edit_id;
CCEditBox* edit_name;
CCEditBox* edit_sex;
CCMenu* menu_add_done;
// 添加按钮回调函数
void AddCallBack(CCObject* obj);
// 添加按钮回调函数
void AddDoneCallBack(CCObject* obj);
// 添加按钮回调函数
void AddDel(CCObject* obj);
void DelDoneCallBack(CCObject* obj); void Oride(CCObject* obj);
void OrideCallBack(CCObject* obj);
void OrideInf(CCObject* obj); void Searchs(CCObject* obj);
void searchsInf(CCObject* obj); void MySort (); public:
static cocos2d::CCScene* scene();
// 初始化层
virtual bool init(); /*因为CCTableView继承自CCScrollView所以要实现这俩个方法,里边一般都不写东西*/
virtual void scrollViewDidScroll(CCScrollView* view);
virtual void scrollViewDidZoom(CCScrollView* view); /*CCTabelViewDelegate类的虚函数*/
//处理触摸点击事件
virtual void tableCellTouched(CCTableView* table, CCTableViewCell* cell); /*CCTabelViewDataSource类的虚函数*/
//每一项的宽度和高度
virtual CCSize cellSizeForTable(CCTableView *table);
//生成列表每一项的内容
virtual CCTableViewCell* tableCellAtIndex(CCTableView *table, unsigned int idx);
//一共多少项
virtual unsigned int numberOfCellsInTableView(CCTableView *table); // 创建层
CREATE_FUNC(ListViewLayer);
}; #endif
ListViewLayer.h
#include "ListViewLayer.h" CCScene* ListViewLayer::scene()
{
CCScene *scene = CCScene::create();
ListViewLayer *layer = ListViewLayer::create();
scene->addChild(layer);
return scene;
} bool ListViewLayer::init()
{
// 添加背景
CCSprite* spBg = CCSprite::create("HelloWorld.jpg");
this->addChild(spBg);
spBg->setPosition(ccp(/, /));
// 放大
spBg->setScale(1.5f); bool bRet = false;
do
{
CC_BREAK_IF( !CCLayer::init() ); // 创建对话框(参数:窗口大小)
pTableView = CCTableView::create(this, CCSizeMake(, ));
// 设置表格方向(垂直)
pTableView->setDirection(kCCScrollViewDirectionVertical);
// 设置坐标
pTableView->setPosition(CCPointZero);
// 设置delegate代理
pTableView->setDelegate(this);
// 设置起点(从上往下)
pTableView->setVerticalFillOrder(kCCTableViewFillTopDown);
// 添加到当前层
this->addChild(pTableView);
// 必须加,意思是用现有的配置去刷新所有的cell
pTableView->reloadData(); bRet = true;
}while(); // 添加按钮
CCMenuItemImage* item_add = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(ListViewLayer::AddCallBack));
// 添加菜单 CCMenuItemImage* item_del = CCMenuItemImage::create(
"del.png",
"CloseSelected.png",
this,
menu_selector(ListViewLayer::AddDel)); CCMenuItemImage*item_oride = CCMenuItemImage::create(
"oride.png",
"CloseSelected.png",
this,
menu_selector(ListViewLayer::Oride)); CCMenuItemImage* item_search = CCMenuItemImage::create(
"search.png",
"search.png",
this,
menu_selector(ListViewLayer::Searchs)); CCMenu* menu_add = CCMenu::create(item_add,item_del,item_oride,item_search,NULL);
item_del->setPositionY();
item_oride->setPositionY();
item_search->setPositionY();
this->addChild(menu_add);
menu_add->setPosition(ccp(,)); return true;
} void ListViewLayer::Searchs(CCObject* obj) { // 添加半透明的背景
layerBg = CCLayerColor::create(ccc4(,,,));
this->addChild(layerBg); // 1. 创建点9图
CCScale9Sprite* input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_id = CCEditBox::create(
CCSizeMake(,),
input);
// 3.添加当前层
this->addChild(edit_id);
// 4.设置坐标
edit_id->setPosition(ccp(,));
edit_id->setPlaceHolder(ChineseString::GBKToUTF8("请输入姓名:")); // 完成添加菜单项
CCMenuItemFont* item_add_done = CCMenuItemFont::create(
ChineseString::GBKToUTF8("查询"),
this,
menu_selector(ListViewLayer::searchsInf));
menu_add_done = CCMenu::create(item_add_done,NULL);
this->addChild(menu_add_done);
menu_add_done->setPosition(ccp(,)); } void ListViewLayer::searchsInf(CCObject* obj) { char* name = (char*)ChineseString::UTF8ToGBK(edit_id->getText()); this->removeChild(ttf);
this->removeChild(edit_id);
this->removeChild(layerBg);
this->removeChild(menu_add_done); bool flag = false;
Students* sTemp;
for(it = Manager::getInstance()->_vStudent.begin();it!=Manager::getInstance()->_vStudent.end();it++) {
sTemp = *it;
if(strcmp(name,sTemp->m_strName)==) {
// 显示详细内容
ttf = CCLabelTTF::create(
ChineseString::GBKToUTF8(CCString::createWithFormat
("%d %s %c",
sTemp->m_iNumber,
sTemp->m_strName,
sTemp->m_sex)->getCString()),
"Arial",
);
this->addChild(ttf);
ttf->setPosition(ccp(,));
flag = true;
break;
}
}
if(flag==false) {
// 显示详细内容
this->removeChild(ttf);
ttf = CCLabelTTF::create(
ChineseString::GBKToUTF8(CCString::createWithFormat
("%s %s",name,"不存在")->getCString()),
"Arial",
);
this->addChild(ttf);
ttf->setPosition(ccp(,));
}
} //产生学号检查
void ListViewLayer::Oride(CCObject* obj) { // 添加半透明的背景
layerBg = CCLayerColor::create(ccc4(,,,));
this->addChild(layerBg); // 1. 创建点9图
CCScale9Sprite* input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_id = CCEditBox::create(
CCSizeMake(,),
input);
// 3.添加当前层
this->addChild(edit_id);
// 4.设置坐标
edit_id->setPosition(ccp(,));
edit_id->setPlaceHolder(ChineseString::GBKToUTF8("请输入学号:")); // 完成添加菜单项
CCMenuItemFont* item_add_done = CCMenuItemFont::create(
ChineseString::GBKToUTF8("修改"),
this,
menu_selector(ListViewLayer::OrideCallBack));
menu_add_done = CCMenu::create(item_add_done,NULL);
this->addChild(menu_add_done);
menu_add_done->setPosition(ccp(,)); } //产生更替信息
void ListViewLayer::OrideCallBack(CCObject* obj) { this->removeChild(edit_id);
this->removeChild(menu_add_done);
this->removeChild(layerBg); bool flag = false; int id = ChineseString::StringToInt(edit_id->getText());
for(it = Manager::getInstance()->_vStudent.begin();it!=Manager::getInstance()->_vStudent.end();it++) {
Students* sTemp = *it;
if(id==sTemp->m_iNumber) {
flag = true;
break;
}
}
if(flag==true) {
// 添加半透明的背景
layerBg = CCLayerColor::create(ccc4(,,,));
this->addChild(layerBg); // 1. 创建点9图
CCScale9Sprite* input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_id
= CCEditBox::create(
CCSizeMake(,),
input);
// 3.添加当前层
this->addChild(edit_id);
// 4.设置坐标
edit_id->setPosition(ccp(,));
edit_id->setPlaceHolder(ChineseString::GBKToUTF8("请输入学号:")); input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_name = CCEditBox::create(
CCSizeMake(,),
input);
edit_name->setPlaceHolder(ChineseString::GBKToUTF8("请输入姓名:"));
// 3.添加当前层
this->addChild(edit_name);
// 4.设置坐标
edit_name->setPosition(ccp(,)); input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_sex = CCEditBox::create(
CCSizeMake(,),
input);
edit_sex->setPlaceHolder(ChineseString::GBKToUTF8("请输入性别:"));
// 3.添加当前层
this->addChild(edit_sex);
// 4.设置坐标
edit_sex->setPosition(ccp(,)); // 完成添加菜单项
CCMenuItemFont* item_add_done = CCMenuItemFont::create(
ChineseString::GBKToUTF8("修改"),
this,
menu_selector(ListViewLayer::OrideInf));
menu_add_done = CCMenu::create(item_add_done,NULL);
this->addChild(menu_add_done);
menu_add_done->setPosition(ccp(,));
}
else {
// 显示详细内容 ttf = CCLabelTTF::create(
ChineseString::GBKToUTF8(CCString::createWithFormat
("%d %s",id,"这个ID不存在")->getCString()),
"Arial",
);
this->addChild(ttf);
ttf->setPosition(ccp(,));
}
} void ListViewLayer::OrideInf(CCObject* obj) { int id2 = ChineseString::StringToInt(edit_id->getText());
char* name = (char*)ChineseString::UTF8ToGBK(edit_name->getText());
char sex = 'M';
Students* s = new Students(id2,name,sex);
*it = s; this->removeChild(ttf);
this->removeChild(edit_id);
this->removeChild(edit_name);
this->removeChild(edit_sex);
this->removeChild(menu_add_done);
this->removeChild(layerBg); MySort();
pTableView->reloadData();
} // 添加按钮回调函数
void ListViewLayer::AddCallBack(CCObject* obj)
{
// 添加半透明的背景
layerBg = CCLayerColor::create(ccc4(,,,));
this->addChild(layerBg); // 1. 创建点9图
CCScale9Sprite* input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_id = CCEditBox::create(
CCSizeMake(,),
input);
// 3.添加当前层
this->addChild(edit_id);
// 4.设置坐标
edit_id->setPosition(ccp(,));
edit_id->setPlaceHolder(ChineseString::GBKToUTF8("请输入学号:")); input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_name = CCEditBox::create(
CCSizeMake(,),
input);
edit_name->setPlaceHolder(ChineseString::GBKToUTF8("请输入姓名:"));
// 3.添加当前层
this->addChild(edit_name);
// 4.设置坐标
edit_name->setPosition(ccp(,)); input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_sex = CCEditBox::create(
CCSizeMake(,),
input);
edit_sex->setPlaceHolder(ChineseString::GBKToUTF8("请输入性别:"));
// 3.添加当前层
this->addChild(edit_sex);
// 4.设置坐标
edit_sex->setPosition(ccp(,)); // 完成添加菜单项
CCMenuItemFont* item_add_done = CCMenuItemFont::create(
ChineseString::GBKToUTF8("添加"),
this,
menu_selector(ListViewLayer::AddDoneCallBack));
menu_add_done = CCMenu::create(item_add_done,NULL);
this->addChild(menu_add_done);
menu_add_done->setPosition(ccp(,));
} // 添加按钮回调函数(字符添加)
void ListViewLayer::AddDoneCallBack(CCObject* obj)
{
this->removeChild(ttf);
// 处理添加信息 int id = ChineseString::StringToInt(edit_id->getText());
char* name = (char*)ChineseString::UTF8ToGBK(edit_name->getText()); char sex = edit_sex->getText()[];
Students* s = new Students(id,name,sex);
Manager::getInstance()->_vStudent.push_back(s);
// 关闭对话框
this->removeChild(edit_id);
this->removeChild(edit_name);
this->removeChild(edit_sex);
this->removeChild(menu_add_done);
this->removeChild(layerBg);
// 刷新列表 MySort(); pTableView->reloadData();
} void ListViewLayer::AddDel(CCObject* obj) {
// 添加半透明的背景
layerBg = CCLayerColor::create(ccc4(,,,));
this->addChild(layerBg); // 1. 创建点9图
CCScale9Sprite* input = CCScale9Sprite::create("input.png");
// 2. 创建输入框
edit_id = CCEditBox::create(
CCSizeMake(,),
input);
// 3.添加当前层
this->addChild(edit_id);
// 4.设置坐标
edit_id->setPosition(ccp(,));
edit_id->setPlaceHolder(ChineseString::GBKToUTF8("请输入学号:")); // 完成添加菜单项
CCMenuItemFont* item_add_done = CCMenuItemFont::create(
ChineseString::GBKToUTF8("删除"),
this,
menu_selector(ListViewLayer::DelDoneCallBack));
menu_add_done = CCMenu::create(item_add_done,NULL);
this->addChild(menu_add_done);
menu_add_done->setPosition(ccp(,)); } void ListViewLayer::DelDoneCallBack(CCObject* obj) {
int id = ChineseString::StringToInt(edit_id->getText()); bool flag = false; vector<Students*>::iterator it;
for(it=Manager::getInstance()->_vStudent.begin();
it!=Manager::getInstance()->_vStudent.end();it++) {
Students* sTemp = *it;
if (id==sTemp->m_iNumber)
{
// 删除元素
Manager::getInstance()->_vStudent.erase(it);
flag = true;
break;
}
} if(flag==false) {
this->removeChild(ttf);
ttf = CCLabelTTF::create(
ChineseString::GBKToUTF8(CCString::createWithFormat
("%d %s",id,"这个ID不存在")->getCString()),
"Arial",
);
this->addChild(ttf);
ttf->setPosition(ccp(,));
} //关闭
this->removeChild(edit_id);
this->removeChild(menu_add_done);
this->removeChild(layerBg); MySort();
pTableView->reloadData(); } bool cmpById(Students* a,Students *b) {
if(a->m_iNumber<b->m_iNumber)
return true;
return false;
} void ListViewLayer::MySort () {
std::sort(Manager::getInstance()->_vStudent.begin(),Manager::getInstance()->_vStudent.end(),cmpById);
} // cell被点击后的回调函数
void ListViewLayer::tableCellTouched(CCTableView* table, CCTableViewCell* cell)
{
pTableView->reloadData();
} //这里设置每个cell的大小
CCSize ListViewLayer::cellSizeForTable(CCTableView *table)
{
return CCSizeMake(, );
} CCTableViewCell* ListViewLayer::tableCellAtIndex(CCTableView *table, unsigned int idx)
{
/*
获得一个可用的cell,因为在我们滑动cell的时候有些cell是显示的,
有些不是显示出来的,把没有渲染的cell拿过来,这样就不用重新new出一个cell了,
可以减小内存的开销
*/
Students* sTmep = Manager::getInstance()->_vStudent[idx];
CCString *pString = CCString::createWithFormat(
"%d %s %c", sTmep->m_iNumber ,
sTmep->m_strName, sTmep->m_sex);
CCTableViewCell *pCell = table->dequeueCell();
if (!pCell) {
pCell = new CCTableViewCell();
pCell->autorelease();
// 单个选项背景
CCSprite *pSprite = CCSprite::create("listitem.png");
pSprite->setAnchorPoint(CCPointZero);
pSprite->setPosition(CCPointZero);
pCell->addChild(pSprite);
pSprite->setScale(0.5f); CCLabelTTF *pLabel = CCLabelTTF::create(ChineseString::GBKToUTF8(pString->getCString()), "楷体", 20.0);
pLabel->setColor(ccc3(, , ));
pLabel->setFontSize();
pLabel->setPosition(ccp(,));
pLabel->setAnchorPoint(CCPointZero);
pLabel->setTag();
pCell->addChild(pLabel);
}
else//获得是没有渲染出来的cell,cell中原有的内容还存在
{
CCLabelTTF *pLabel = (CCLabelTTF*)pCell->getChildByTag();
pLabel->setString(ChineseString::GBKToUTF8(pString->getCString()));
}
return pCell;
} // 这里设置一共有多少个cell
unsigned int ListViewLayer::numberOfCellsInTableView(CCTableView *table)
{
// 返回容器的大小
return Manager::getInstance()->_vStudent.size();
} void ListViewLayer::scrollViewDidScroll(CCScrollView *view)
{
} void ListViewLayer::scrollViewDidZoom(CCScrollView *view)
{
}
ListViewLayer.cpp
学生信息管理系统(cocos2d引擎)——数据结构课程设计的更多相关文章
- 记C++课程设计--学生信息管理系统
C++课程设计--学生信息管理系统 ...
- Java课程设计---学生信息管理系统需求分析及总体设计
按照软件工程实践的原则,开发大型程序需要经历需求分析.总体设计.详细设计.编码实现.系统测试.系统维护等几个阶段. 1.需求分析 本阶段是整个软件开发过程中最重要的环节.通过了解实际运行的系统或与用户 ...
- java开发学生信息管理系统的实现(简洁易懂),适合计算机专业学生参考,课程设计、毕业论文设计参考等
编写一个简单的学生管理信息系统. 在oracle中设计一张学生表,以学号作为关键字. 其他学生信息有:姓名.手机号. 在进入系统时,显示如下菜单: ************************** ...
- 【python免费代码】设计一个简单的学生信息管理系统
文章目录 前言 一.理解 二.部分截图展示 三.代码 四.总结 前言 设计一个简单的学生信息管理系统,实现以下功能(bug) : 录入学生信息,信息以文件方式存储 以学生学号或者学生姓名为条件查询该学 ...
- 大一C语言结课设计之《学生信息管理系统》
第一次写这么长的程序,代码仅供參考,有问题请留言. /* ** 学生信息管理系统 ** IDE:Dev-Cpp 4.9.9.2 ** 2014-6-15 */ #include <stdio.h ...
- Java课设(学生信息管理系统)
1.团队课程设计博客链接 http://www.cnblogs.com/Min21/p/7064093.html 2.个人负责模板或任务说明 设计登陆界面和学生信息界面的设计,学生信息的显示.退出等功 ...
- [项目分享]JSP+Servlet+JDBC实现的学生信息管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://gitee.com/liu_xu111/JavaWeb01 这次分享一个学生管理系统,我感觉这是程序员在大学时期的毕设和课程设计选择最多 ...
- 学生信息管理系统总结——student数据库中表关系分析
说到关系,那就不得不提两个东西: 1.E-R图,也称实体-联系图(Entity Relationship Diagram),提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型 2.关系模 ...
- Java 实现学生信息管理系统
编写一个简单的学生管理信息系统. 在oracle中设计一张学生表,以学号作为关键字. 其他学生信息有:姓名.手机号. 在进入系统时,显示如下菜单: ************************** ...
- 【Python3.6+Django2.0+Xadmin2.0系列教程之二】学生信息管理系统(入门篇)
上一篇我们已经创建好了一个Xadmin的基础项目,现在我们将在此基础上构建一个同样很基础的学生信息管理系统. 一.创建模型 模型是表示我们的数据库表或集合类,并且其中所述类的每个属性是表或集合的字段, ...
随机推荐
- HTML表单
表单的主要作用在于在网页上提供一个图形用户界面,以采集和提交用户输入的数据.使用输入控件:1.文本框<input type="text">:2.口令输入框input t ...
- vim 设置行号
1.打开vim 输入 :echo $VIM 查看vim路径 一般是/use/share/vim 2.sudo vim vimrc 打开配置文件,G到文件末尾 3. 插入 :set number 保存推 ...
- PHP底层工作原理
最近搭建服务器,突然感觉lamp之间到底是怎么工作的,或者是怎么联系起来?平时只是写程序,重来没有思考过他们之间的工作原理: PHP底层工作原理 图1 php结构 从图上可以看出,php从下到上是一个 ...
- bootstrap插件引用
若按照步骤报这种错误,从这几方面进行排错 1.引用css/js的顺序 2.是否以及引入相应的包 3.是否正确调用(此处需要注意有require.js的情况,要不把switch方法写入require里面 ...
- Java 对象销毁
Java语言拥有一套完整的垃圾回收机制. 何种对象会被java虚拟机视为垃圾.主要包括以下两种情况: (1)对象引用超过其作用范围,则这个对象将被视为垃圾 (2)将对象赋值为null 参考资料:Jav ...
- Python开发程序:生产环境下实时统计网站访问日志信息
日志实时分析系统 生产环境下有需求:要每搁五分钟统计下这段时间内的网站访问量.UV.独立IP等信息,用直观的数据表格表现出来 环境描述: 网站为Nginx服务,系统每日凌晨会对日志进行分割,拷贝到其他 ...
- 使用SSIS汇集监控数据
1.背景 数据库服务器部署有各类巡检脚本,现在想把巡检收集到的数据汇集到一起.Source源对应的是各业务数据库服务器,Destination目标对应的是保存汇集数据的服务器.前期部署的时候已将巡检相 ...
- Hadoop学习笔记: 安装配置Hive
1. 在官网http://hive.apache.org/下载所需要版本的Hive,以下我们就以hive 2.1.0版为例. 2. 将下载好的压缩包放到指定文件夹解压,tar -zxvf apache ...
- iOS,手势识别简单使用
1.iOS目前支持的手势识别(6种) 2.点按手势和慢速拖动手势简单使用 iOS目前支持的手势识别(6种) UITapGestureRecognizer(点按) UIPinchGestureRecog ...
- 使用mybatis-generator自动生成映射配置
使用mybatis时,编写实体类与数据库的映射是一项繁琐的工作,很容易出错,而mybatis-generator工具很好地解决了这个问题. 一.工具下载与配置 下载地址:① https://gith ...