用于乒乓球,羽毛球等比赛记分,并可查看比赛记录sql
小回合记分 大比分记分 随时查看比赛记录 计时功能 一局比赛结束换位功能数据库
小回合记分 大比分记分 记分时不息屏 随时查看比赛记录 摇一摇截屏 可选比赛为普通比赛 标准比赛(标准比赛比普通比赛更严格,必须根据比赛规则结束比赛)小程序
队名输入 随机先手 翻页、分数上下区域点击、按钮均可增减比分 从新开始比赛 摇一摇截屏 记分时不息屏bash
计时功能 一局比赛结束换位功能布局
1.页面布局:小比分使用UIPageViewController,能够实现翻页效果和自带的点击效果;使用Masonry和frame混合布局 2.数据存储:fmdb使用测试
1.分数视图封装:包括上面的小比分,加减和重置按钮,UIPageViewController的使用;ui
CGFloat width = kSCREENW/2 - 2*KWidth(20);
self.pageBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, width)];
[self addSubview:self.pageBgView];
self.pageVC = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationVertical options:nil];
self.pageVC.view.frame = self.pageBgView.bounds;
// 设置当前显示的控制器
[self.pageVC setViewControllers:@[self.dataArray[0]] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
self.pageVC.delegate = self;
self.pageVC.dataSource = self;
[self.pageBgView addSubview:self.pageVC.view];
[self.parentVC addChildViewController:self.pageVC];
复制代码
- (RBPageChildrenVC *)viewControllerAtIndex:(NSUInteger)index {
// Return the data view controller for the given index.
if (([self.dataArray count] == 0) || (index >= [self.dataArray count])) {
return nil;
}
RBPageChildrenVC *chiledVC = self.dataArray[index];
return chiledVC;
}
复制代码
- (NSUInteger)indexOfViewController:(RBPageChildrenVC *)viewController {
return viewController.number.integerValue;
}
复制代码
// 向前翻页展现的ViewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSInteger index = [self indexOfViewController:(RBPageChildrenVC *)viewController];
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
self.currentIndex = index;
return [self viewControllerAtIndex:index];
}
// 向后翻页展现的ViewController
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = [self indexOfViewController:(RBPageChildrenVC *)viewController];
if (index == NSNotFound) {
return nil;
}
index++;
self.currentIndex = index;
if (index == [self.dataArray count]) {
return nil;
}
return [self viewControllerAtIndex:index];
}
复制代码
- (NSMutableArray *)leftArray {
if (_leftArray == nil) {
_leftArray = [NSMutableArray arrayWithCapacity:0];
for (int i = 0; i <= MAX_COUNT; i++) {
RBPageChildrenVC *childrenVC = [[RBPageChildrenVC alloc] init];
childrenVC.isRed = YES;
childrenVC.number = [NSString stringWithFormat:@"%d", i];
[_leftArray addObject:childrenVC];
}
}
return _leftArray;
}
复制代码
self.leftScoreView = [[RBScoreView alloc] initWithFrame:CGRectMake(0, 0, width, width + KHeight(10+2*44)) parentVC:self dataArray:self.leftArray];
self.leftScoreView.backgroundColor = RBRedColor;
[self.leftBgView addSubview:self.leftScoreView];
// self.leftScoreView.buttonClickAnimated = YES;
[self.leftScoreView mas_makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(self.leftBgView).offset(0);
make.size.mas_equalTo(CGSizeMake(width, width + KHeight(10+2*44)));
make.top.equalTo(self.leftBgView.mas_centerY).offset(0);
}];
复制代码
到这里首页基本的视图就OK了,其余的都是很简单控件的使用了。 编码
2.比赛记录数据存储:fmdb数据库封装,小比分的存储url
数据类型 | 说明 |
---|---|
NULL | 空值 |
INTEGER | 有符号整数,存储在一、二、三、四、6或8个字节中 |
REAL | 浮点数,存储为8字节的IEEE浮点数 |
TEXT | 文本串,使用数据库编码(UTF-8, UTF-16BE或UTF-16LE)存储 |
BLOB | 大块数据,image存储 |
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Score.db"];
NSLog(@"------path:%@", path);
fmDatabase = [FMDatabase databaseWithPath:path];
BOOL isOpen = [fmDatabase open];
if (isOpen) {
NSLog(@"数据库打开成功!");
} else {
NSLog(@"数据库打开失败!");
}
NSString *sql = @"create table if not exists MyScore(id integer primary key autoincrement, date text, content text, redname text, bluename text, redscore integer, bluescore integer, gametype integer)";
if ([fmDatabase executeUpdate:sql]) {
NSLog(@"表建立成功!");
[fmDatabase close];
} else {
NSLog(@"表建立失败!");
}
复制代码
if ([fmDatabase executeUpdate:sql, score.date, score.content, score.redName, score.blueName, @(score.redScore), @(score.blueScore), @(score.blueScore), @(score.gameType)]) {
NSLog(@"数据插入成功!");
[fmDatabase close];
} else {
NSLog(@"数据插入失败!");
NSLog(@"error = %@", [fmDatabase lastErrorMessage]);
}
复制代码
BOOL isOpen = [fmDatabase open];
if (isOpen) {
NSLog(@"数据库打开成功!");
} else {
NSLog(@"数据库打开失败!");
}
NSString *sql = @"select * from MyScore";
FMResultSet *set = [fmDatabase executeQuery:sql];
NSMutableArray *array = [[NSMutableArray alloc] init];
while ([set next]) {
RBScoreModel *scoreModel = [[RBScoreModel alloc] init];
scoreModel.date = [set stringForColumn:@"date"];
scoreModel.content = [set stringForColumn:@"content"];
scoreModel.scoreId = [set intForColumn:@"id"];
scoreModel.redName = [set stringForColumn:@"redname"];
scoreModel.redScore = [set intForColumn:@"redscore"];
scoreModel.blueName = [set stringForColumn:@"bluename"];
scoreModel.blueScore = [set intForColumn:@"bluescore"];
scoreModel.gameType = [set intForColumn:@"gametype"];
[array addObject:scoreModel];
}
[fmDatabase close];
return array;
复制代码
- (BOOL)deleteTable {
NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents/Score.db"];
NSFileManager *manager = [NSFileManager defaultManager];
NSError *error = nil;
if ([manager fileExistsAtPath:path]) {
BOOL isRemove = [manager removeItemAtPath:path error:&error];
if (isRemove) {
// 删除成功后从新建立table 防止测试时新增字段
[self createTable];
return YES;
}
else {
NSLog(@"%@", error);
return NO;
}
}
else {
return YES;
}
}
复制代码
2-6.按钮操做添加数据spa
NSDictionary *littleScoreDic = @{@"redScore":@(self.leftScoreView.currentIndex), @"blueScore":@(self.rightScoreView.currentIndex), @"roundEndTime":[RBTool getCurrentDateWithFormat:@"yyyy-MM-dd HH:mm:ss"]};
[self.littleArray addObject:littleScoreDic];
复制代码
RBScoreModel *model = [[RBScoreModel alloc] init];
model.date = [RBTool getCurrentDateWithFormat:@"yyyy-MM-dd HH:mm:ss"];
model.redName = self.leftTeamView.nameText;
model.redScore = self.leftBigScoreTF.text.length == 0?0:self.leftBigScoreTF.text.integerValue;
model.blueName = self.rightTeamView.nameText;
model.blueScore = self.rightBigScoreTF.text.length == 0?0:self.rightBigScoreTF.text.integerValue;
model.gameType = self.gameType;
NSString *content = [RBTool convertObjectToJson:self.littleArray];
model.content = content;
[[FMDBManager sharedDBManager] addScoreModel:model];
复制代码
至此,文章就该结束了,可是我发现不少人不太会使用比赛记分器,因此文章末尾添加了比赛记分器的使用方法。
以乒乓球比赛为例: 1.使用顺序,选择比赛类型,输入比赛双方的队名,摇先手,看谁先发球,而后赢得一方加分数,本回合结束点击按钮回合结束,比赛结束点击比赛结束。 2.“+”按钮用于增长分数,“-”按钮减小分数,“重置”按钮用于重置分数。 3.小比分是大框的比分,表明一个回合的比分;大比分是小框的比分,表明一局比赛的比分。“回合结束”表示一回合(一局)比赛结束,小比分清空,小比分多的一队大比分加1;“比赛结束”表示本局比赛结束,比赛比分所有重置。 4.比赛结束后默认跳转到比赛结果列表,可查看比赛结果。