工程文件:
根视图控制器的代码不说了,主要的代码在
RootViewController.m中:
#import "RootViewController.h"
@interface RootViewController ()
// 直接赋值的不需要在dealloc中释放
// 将计数器的初始值设置成属性方便调用
@property (nonatomic,assign)NSInteger number;
@end
@implementation RootViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
// 设置按钮的相关属性
btn.frame = CGRectMake(100, 100, 150, 50);
btn.backgroundColor = [UIColor orangeColor];
[btn setTitle:@"请输入验证码" forState:UIControlStateNormal];
// 可以设置成属性或者tag值,这里使用tag值方法
btn.tag = 1000;
// 添加方法
[btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
// 添加到视图
[self.view addSubview:btn];
// 释放 方法创建不需要手动释放
// 初始化计数器的值
self.number = 5;
}
// 实现按钮点击方法
- (void)btnClick:(UIButton *)btn
{
// 创建一个计数器 自动到0 之后重新发送
// 此处的repeats属性只有YES时,才能实现自动计数
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(timerAction:) userInfo:@"button倒计时提示" repeats:YES];
// 计时器开始
[timer fire];
// 必须关闭交互,不然每次点击都会产生一个计数器
btn.userInteractionEnabled = NO;
}
- (void)timerAction:(NSTimer *)timer
{
// 取出点击的Button
UIButton *btn = (UIButton *)[self.view viewWithTag:1000];
// 如果计数器的值为0时,显示为重新发送验证码
// 判断计时器是否结束 就是他标题为0
if ([[btn titleForState:UIControlStateNormal] isEqualToString:@"0"]) {
// 计时器停止
[timer invalidate];
// 交互打开
btn.userInteractionEnabled = YES;
// 更改标题
[btn setTitle:@"重新发送验证码" forState:UIControlStateNormal];
// 重置计数器的值
self.number = 5;
}else{
[btn setTitle:[NSString stringWithFormat:@"%ld",self.number--] forState:UIControlStateNormal];
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
三维图
window->根视图->button
* 效果图*