1.利用xib方式新建一个秒表计数器。
功能实现:
该应用有三个按钮:开始,记次,复位
开始:开始控制着秒表的开始,点击后,按钮文字变成停止,在没有开始的情况下不允许记次操作
记次:可以记录多个你点击的时间,
复位:复位可以让秒表归零
实现效果图如下:
1.
新建一个类,勾选xib,然后新建一个试图监控器,然后加载到根视图中
在AppDelegate.m中代码如下:
//新建一个视图控制器 MainViewController *myView = [[MainViewController alloc]init]; //将新建的视图控制器放到根视图中去。 self.window.rootViewController = myView;
2.
我们在xib文件进行拖控件,两个label 和三个button,第一个label是一个不用操控的,只是一个
题目而已
第二个label是一个现实秒表数据的label
然后是三个按钮,分别用来控制开始,记次,和复位:
视图如下:
3.
在MainViewController.h中声明成员变量:毫秒,秒,分钟:另外还有一个NSTimer类型的timer;来用来接收计时器的方法
以每隔一毫秒调用让成员变成产生变化:
因为我们要和按钮进行交互,所以当我按下按钮的时候,按钮的文本变成了“停止”,这时候就需要一个临时变量。然后
用判断的方法,来对按钮进行更换文本,一般我们定义一个BOOL类型的变量。
然后就是三个按钮控制的方法:
代码如下:
#import <UIKit/UIKit.h> @interface MainViewController : UIViewController{ int persent; int seconds; int minutes; IBOutlet UILabel *label; BOOL isOn; } @property (nonatomic,strong )NSTimer *timer; - (IBAction)start:(id)sender; - (IBAction)record; - (IBAction)reset; @end
4.
首先我们开始实现方法:
对数据成员进行初始化:然后新建一个计时器,控制时间的不断变化:
代码如下:
- (void)viewDidLoad { [super viewDidLoad]; isStop = YES; //类方法会自动释放。 self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(startTimer) userInfo:nil repeats:YES]; //需要让定时器暂停 [_timer setFireDate:[NSDate distantFuture]]; // Do any additional setup after loading the view from its nib. }
5.
在计数器里面我们看到一个方法:“startTimer”,没过1毫秒就调用这个方法,然后在这个方法中我们可以对成员变量
进行操作:代码如下:
-(void)startTimer{ percens++; //没过100毫秒,就让秒+1,然后让毫秒在归零 if(percens==100){ seconds++; percens = 0; } if (seconds == 60) { minus++; seconds = 0; } //让不断变量的时间数据进行显示到label上面。 label.text = [NSString stringWithFormat:@"%02d:%02d.%02d",minus,seconds,percens]; }
6.
然后考虑到的就是我们怎么控制的问题了,思路:我们只需把 [_timer setFireDate:[NSDate distantFuture]];
方法中的NSDate修改为当前的时间就可以让计时器立即执行:然后我们在开始按钮关联的方法中进行操作
代码如下:
//sender是触发者,响应者是当前类的对象 //目标动作机制。 //启动 -(IBAction)start:(id)sender{ UIButton *btn = (UIButton *)sender; //如果按钮此时的状态是yes,那么我们按下后就把文本变成“停止”,然后让isStop = NO; //最主要的是让[_timer setFireDate:[NSDate date]];让计时器开始运行 if (isStop) { [btn setTitle:@"停止" forState:UIControlStateNormal]; [_timer setFireDate:[NSDate date]]; isStop = NO; }else{//如果isStop = NO,当按钮按下的时候就让按钮的文本变成“开始”,然后在把isStop = YES; //然后让[_timer setFireDate:[NSDate distantFuture]];,让计时器停止运行 [btn setTitle:@"开始" forState:UIControlStateNormal]; [_timer setFireDate:[NSDate distantFuture]]; isStop = YES; } //设置定时器的启动时间为当前时间。 //[_timer setFireDate:[NSDate date]]; }
7.
然后我们开始写记录时间的方法,这个方法中需要我们定义两个UILabel,分别用来显示第一次按下的数据和
按下的时候时间的数据。代码如下:
//记次 -(IBAction)record{ //如果秒表没有启动,则无法点击 if(isStop)return; static int count=0; UILabel *countLabel = [[UILabel alloc]init]; //用来显示次数。Y轴不断的向下延伸,260是上一个控件占用的长度 countLabel.frame = CGRectMake(10, count*30+260, 100, 30); countLabel.text = [NSString stringWithFormat:@"记次 %d",++count]; //NSLog(@"%@",countLabel); [self.view addSubview:countLabel]; //记时label UILabel *timeLabel = [[UILabel alloc]init]; //count之所以减去1,因为++count,而次数和时间的数据要显示在同一行 timeLabel.frame = CGRectMake(220, 260+(count-1)*30, 100, 30); timeLabel.text = label.text; [self.view addSubview:timeLabel]; }
8.
最后就是我们的复位的方法了这个方法比较简单,只需要把成员变量置0,然后赋值就可以了
代码如下
//复位 -(IBAction)reset{ percens = 0; seconds = 0; minus = 0; label.text = [NSString stringWithFormat:@"%02d:%02d.%02d",percens,seconds,minus]; }
9.
缺憾:
1.记次次数过多的时候,的文本显示没有滚动条,所以一个屏幕只能显示数个记录的时间数据
2.在复位的时候,如果开始按钮处于停止的文本,没有实现控制开始按钮让其变为初始值“开始”
10.手写代码实现:
由于源代码和上面的步骤差不多,这里就不做过多的介绍,仅提供源代码:
介绍结束:
版权声明:本文为博主原创文章,未经博主允许不得转载。