周末闲来无事,看一个概念,挺有意思的,舒尔特表,网上也有很多人写过类似的Demo,本人闲来无事也写了一下,舒尔特表听起来很高大上的样子,不过本人的理解就是一个正方形的矩阵中放的各种小格子,可以是字母,数字或者说是文字,舒尔特表可以通过动态的练习锻炼视神经末梢。心理学上用此表来研究和发展心理感知的速度,其中包括视觉定向搜索运动的速度。培养注意力集中、分配、控制能力;拓展视幅;加快视频;提高视觉的稳定性、辨别力、定向搜索能力。练习的时间越长,看表所需的时间会越短。随着练习的深入,眼球的末梢视觉能力提高,不仅初学者可以有效地拓展视幅,加快阅读节奏,锻炼眼睛快速认读;而且对于进入提高阶段之后,同时拓展纵横视幅,达到一目十行、一目一页非常有效。每表按字符顺序,迅速找全所有的字符,平均1个字符用1秒钟成绩为优良,即9格用9秒、16格用16秒、25格用25秒。(百度百科)

页面布局

根据上面的概念,大概页面布局就是3*3的九宫格,一般是选择数字练习,也没有特别的多弄弄,Main.storyBoard的布局如下:

需要将所有的按钮弄成一个集合,还有就是所有按钮共用一个事件:

集合演示:

按钮共用事件演示:

Demo实现

上面中的界面主要都是数字1,因此需要的一个方法生成一个随机的数组,方法如下,生成一个随机不重复的数组大概的规则就是首先顶一个数组,之后的话,需要将数组打乱,使用随机数随机生成索引即可:

- (NSArray *)getDataArray{
//需要展示的数组
NSMutableArray *arr=[NSMutableArray array];
for (NSInteger i=1; i<10; i++) {
[arr addObject:@(i)];
}
NSInteger count=[arr count];
//生成随机数组
for (NSInteger i=0; i<count; i++) {
NSInteger index=arc4random()%(count-i)+i;
[arr exchangeObjectAtIndex:index withObjectAtIndex:i];
}
return arr;
}

将数组中的值赋值给页面的按钮:

- (void)initButtonTitle{
//实例化结果集的可变数组
self.resultArr=[NSMutableArray array];
NSArray *arr=[self getDataArray];
for (UIButton *button in self.visionButtons) {
NSString *result=[arr[button.tag-1]stringValue];
[button setTitle:result forState:UIControlStateNormal];
//重新开始的时候要重新设置按钮的背景和状态
[button setBackgroundColor:[UIColor yellowColor]];
[button setEnabled:YES];
}
[_timerLabel setText:@"00:00"];
self.timer=[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:nil repeats:YES];
}

在viewDidLoad启动的时候调用对应的程序:

  [self initButtonTitle];

 这个时候看到页面的布局应该是这样的:

做到这一步基本上这个程序完成差不多了,然后就是计时,完成之后统计,闲来看下具体的效果,然后看代码可能会更好一点:

功能基本上就是设置按钮的背景颜色,是否可以点击,计时,清零,弹框,显示之前点击的结果,一步一步的分析:

定义成员变量计时和存储结果:

@interface ViewController ()
@property NSMutableArray *resultArr;
@property NSTimer *timer;
@property NSDate *beginDate;
@end

设置定时器:

   self.timer=[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:nil repeats:YES];

设置按钮的背景颜色和显隐:

 [button setBackgroundColor:[UIColor yellowColor]];
[button setEnabled:YES];

统计时间:

 NSInteger allTime=[_timer.fireDate timeIntervalSinceDate:_beginDate];
NSString *timeFormat=[NSString stringWithFormat:@"%02ld:%02ld",allTime/1000,allTime%1000];
[_timerLabel setText:timeFormat];

判断结果,如果所有的结果是升序的那么是成功的,否则就是失败的:

//判断一个数组是不是升序
- (BOOL)getArrayAsc:(NSArray *)originalArr{
for (NSInteger i=0; i<[originalArr count]-1; i++) {
if (originalArr[i]>originalArr[i+1]) {
return NO;
}
}
return YES;
}

所有按钮的点击事件如下:

- (IBAction)getResult:(id)sender {
UIButton *button=(UIButton *)sender;
//设置背景颜色
[button setBackgroundColor:[UIColor greenColor]];
//按钮点击一次就不再点击
[button setEnabled:NO];
NSInteger value=[[[button titleLabel] text] integerValue];
[self.resultArr addObject:[NSNumber numberWithInteger:value]];
//点击第一个按钮之后设置开始时间
if ([self.resultArr count]==1) {
//游戏开始时间
_beginDate=[NSDate date];
//游戏开始
[_timer fire];
}
NSInteger allTime=[_timer.fireDate timeIntervalSinceDate:_beginDate];
NSString *timeFormat=[NSString stringWithFormat:@"%02ld:%02ld",allTime/1000,allTime%1000];
[_timerLabel setText:timeFormat];
//所有的点击完成之后的调用
if ([self.resultArr count]==9) {
//销毁定时器
[_timer invalidate];
//弹框
NSString *tip;
if ([self getArrayAsc:self.resultArr]) {
tip=@"恭喜你,通过比赛";
}else{
tip=@"不好意思,比赛失败";
}
//将点击的结果使用逗号进行拼接
NSString *resultStr=[NSString stringWithFormat:@"%@",[self.resultArr componentsJoinedByString:@","]]; UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:tip message:resultStr delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alterView show];
}
}

 ViewController.m中的代码:

//
// ViewController.m
// TableVision
//
// Created by keso on 15/1/18.
// Copyright (c) 2015年 keso. All rights reserved.
// #import "ViewController.h" @interface ViewController ()
@property NSMutableArray *resultArr;
@property NSTimer *timer;
@property NSDate *beginDate;
@end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[self initButtonTitle];
// self.timer=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:nil userInfo:nil repeats:YES];
}
- (void)triggerTime:(NSTimer *)sender{ }
- (void)initButtonTitle{
//实例化结果集的可变数组
self.resultArr=[NSMutableArray array];
NSArray *arr=[self getDataArray];
for (UIButton *button in self.visionButtons) {
NSString *result=[arr[button.tag-1]stringValue];
[button setTitle:result forState:UIControlStateNormal];
//重新开始的时候要重新设置按钮的背景和状态
[button setBackgroundColor:[UIColor yellowColor]];
[button setEnabled:YES];
}
[_timerLabel setText:@"00:00"];
self.timer=[NSTimer scheduledTimerWithTimeInterval:0.1 invocation:nil repeats:YES];
}
- (IBAction)oneMore:(id)sender {
[self initButtonTitle];
} - (NSArray *)getDataArray{
//需要展示的数组
NSMutableArray *arr=[NSMutableArray array];
for (NSInteger i=1; i<10; i++) {
[arr addObject:@(i)];
}
NSInteger count=[arr count];
//生成随机数组
for (NSInteger i=0; i<count; i++) {
NSInteger index=arc4random()%(count-i)+i;
[arr exchangeObjectAtIndex:index withObjectAtIndex:i];
}
return arr;
} - (IBAction)getResult:(id)sender {
UIButton *button=(UIButton *)sender;
//设置背景颜色
[button setBackgroundColor:[UIColor greenColor]];
//按钮点击一次就不再点击
[button setEnabled:NO];
NSInteger value=[[[button titleLabel] text] integerValue];
[self.resultArr addObject:[NSNumber numberWithInteger:value]];
//点击第一个按钮之后设置开始时间
if ([self.resultArr count]==1) {
//游戏开始时间
_beginDate=[NSDate date];
//游戏开始
[_timer fire];
}
NSInteger allTime=[_timer.fireDate timeIntervalSinceDate:_beginDate];
NSString *timeFormat=[NSString stringWithFormat:@"%02ld:%02ld",allTime/1000,allTime%1000];
[_timerLabel setText:timeFormat];
//所有的点击完成之后的调用
if ([self.resultArr count]==9) {
//销毁定时器
[_timer invalidate];
//弹框
NSString *tip;
if ([self getArrayAsc:self.resultArr]) {
tip=@"恭喜你,通过比赛";
}else{
tip=@"不好意思,比赛失败";
}
//将点击的结果使用逗号进行拼接
NSString *resultStr=[NSString stringWithFormat:@"%@",[self.resultArr componentsJoinedByString:@","]]; UIAlertView *alterView=[[UIAlertView alloc] initWithTitle:tip message:resultStr delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];
[alterView show];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
//判断一个数组是不是升序
- (BOOL)getArrayAsc:(NSArray *)originalArr{
for (NSInteger i=0; i<[originalArr count]-1; i++) {
if (originalArr[i]>originalArr[i+1]) {
return NO;
}
}
return YES;
} @end

iOS开发-舒尔特表的更多相关文章

  1. iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇

    前几天发布了一篇iOS开发之多表视图滑动切换示例(仿"头条"客户端)的博客,之所以写这篇博客,是因为一位iOS初学者提了一个问题,简单的写了个demo做了个示范,让其在基础上做扩展 ...

  2. iOS开发笔记11:表单键盘遮挡、浮点数价格格式化显示、省市区选择器、View Debugging

    1.表单键盘遮挡 应用场景为一个collectionView上有多个textfield.textView供用户填写信息. 之前输入项较少时,采取的方法比较粗暴,didSelectItemAtIndex ...

  3. 我的iOS开发系列博文

    之前目录性的总结了发表过的关于OC方面的文章,今天在目录性的总结一下有关iOS开发的文章.走过路过不要错过哦,今天的博文也全都是干货.写技术博客与大家交流一下思想也是不错的. 下面是我的技术博客中有关 ...

  4. iOS开发之表视图爱上CoreData

    在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功 ...

  5. iOS企业级开发初级课程-表视图(13集)

    首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜 ...

  6. IOS开发之表视图(UITableView)

    IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于 ...

  7. IOS开发中UITableView(表视图)的滚动优化及自定义Cell

    IOS开发中UITableView(表视图)的滚动优化及自定义Cell IOS 开发中UITableView是非常常用的一个控件,我们平时在手机上看到的联系人列表,微信好友列表等都是通过UITable ...

  8. iOS开发tableView去掉顶部上部空表区域

    tableview中的第一个cell 里上部 有空白区域,大概64像素 在viewDidLoad中加入如下代码 self.automaticallyAdjustsScrollViewInsets = ...

  9. iOS开发遇到的坑之五--解决工程已存在plist表,数据却不能存入的问题

    想写这篇博客其实在一两个月前开发遇见的时候就想把这个问题写成博客的,奈何自己一直懒外加一直没有时间,就把这个事情给耽搁了,好在当时知道下自己一定要把这个问题给描述出来,免得以后其他人遇到这个问题会纠结 ...

随机推荐

  1. 洛谷P3527 [POI2011]MET-Meteors [整体二分]

    题目传送门 Meteors 格式难调,题面就不妨放了. 分析: 一道整体二分的练手题. 就是一般的整体二分的套路,但是要注意,将修改和询问加入队列的时候要先加修改再加询问.另外,博主代码打得太丑,常数 ...

  2. java中int和Integer比较

    java中int和Integer比较 一,类型区别 我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的 ...

  3. 深度学习基础系列(九)| Dropout VS Batch Normalization? 是时候放弃Dropout了

    Dropout是过去几年非常流行的正则化技术,可有效防止过拟合的发生.但从深度学习的发展趋势看,Batch Normalizaton(简称BN)正在逐步取代Dropout技术,特别是在卷积层.本文将首 ...

  4. 【SQL】177. Nth Highest Salary

    Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...

  5. 选择排序之Java实现

    选择排序之Java实现 一.方法一 package cn.com.zfc.lesson21.sort; /** * * @title SelectSort * @describe 选择排序 * @au ...

  6. CodeForces600E Lomsat gelral 线段树合并

    从树上启发式合并搜出来的题 然而看着好像线段树合并就能解决??? 那么就用线段树合并解决吧 维护\(max, sum\)表示值域区间中的一个数出现次数的最大值以及所有众数的和即可 复杂度\(O(n \ ...

  7. BZOJ.1032.[JSOI2007]祖码(区间DP)

    题目链接 BZOJ 洛谷 AC代码: 区间DP,f[i][j]表示消掉i~j需要的最少珠子数. 先把相邻的相同颜色的珠子合并起来. 枚举方法一样,处理一下端点可以碰撞消除的情况就行. 当然合并会出现问 ...

  8. python 中__name__ = '__main__' 的作用,到底干嘛的?

    python 中__name__ = 'main' 的作用,到底干嘛的? 有句话经典的概括了这段代码的意义: "Make a script both importable and execu ...

  9. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  10. hdoj 5119 Happy Matt Friends 背包DP

    Happy Matt Friends Time Limit: 6000/6000 MS (Java/Others) Memory Limit: 510000/510000 K (Java/Others ...