公司做的项目,经过半年的迭代,越来越稳定,一直没有时间也没有精力,静下心了学习Swift。之前很迷茫,不知道是学Swift,还是学前端。考虑到是学iOS出身,还是先学好Swift,在去学习其他的把。
新建项目,导入三方库,暂时用得到的只有这么多:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, ‘8.0’
use_frameworks!
target ‘PandaSwift’ do
pod 'Alamofire', '~> 4.2.0'
pod 'HandyJSON', '~> 1.3.0'
pod 'SnapKit', '~> 3.0.2'
pod 'SwiftyJSON', '~> 3.1.3'
pod 'PKHUD', '~> 4.0'
pod 'Kingfisher', '~> 3.4.0'
end
想着拿公司的项目,做个Swift版本来先练练手。首先是登录注册页面,获取验证码的逻辑和OC 不太一样,OC的做法是在调取验证码接口,利用GCD或者定时器来完成,根据描述来判断按钮的状态,代码入下
__block int timeout = 59;
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,queue);
dispatch_source_set_timer(_timer,dispatch_walltime(NULL, 0),1.0*NSEC_PER_SEC, 0); //每秒执行
dispatch_source_set_event_handler(_timer, ^{
if(timeout<=0)
{ //倒计时结束,关闭
dispatch_source_cancel(_timer);
dispatch_async(dispatch_get_main_queue(), ^{
[codeBtn setTitle:@"发送验证码" forState:UIControlStateNormal];
[codeBtn setBackgroundImage:[UIImage imageNamed:@"codebtn"] forState:UIControlStateNormal];
codeBtn.userInteractionEnabled = YES;
});
}
else
{
NSString * titleStr = [NSString stringWithFormat:@"剩余%d秒",timeout];
[codeBtn setBackgroundImage:[UIImage imageNamed:@"codebtn_no"] forState:UIControlStateNormal];
dispatch_async(dispatch_get_main_queue(), ^{
[codeBtn setTitle:titleStr forState:UIControlStateNormal];
codeBtn.userInteractionEnabled = NO;
});
timeout--;
}
});
dispatch_resume(_timer);
Swift版本就用willSet 和 didSet 来实现按钮的状态切换。
var countdownTimer: Timer?
var remainingSeconds:Int = 0 {
willSet{
codeBtn.setTitle("剩余\(newValue)s", for: .normal)
if newValue <= 0
{
codeBtn.setTitle("获取验证码", for: .normal)
isCounting = false
}
}
}
var isCounting = false{
willSet{
if newValue{
countdownTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (timer) in
self.remainingSeconds -= 1
})
remainingSeconds = 9
codeBtn.backgroundColor = UIColor.gray
}else{
countdownTimer?.invalidate()
countdownTimer = nil
codeBtn.backgroundColor = UIColor.red
}
codeBtn.isEnabled = !newValue
}
}
然后在Btn的点击事件设置 把isCounting置为ture。
willSet是在设置新值之前调用,willSet观察器会将新的值作为参数传入,默认参数名为newValue。didSet是设置新值后立即调用,观察期会将旧的值作为参数传入,默认参数为oldValue。
需要注意的是在属性初始化的时候不会调用willSet 和 didSet方法。如果在didSet 为属性赋值,这个值会替换原来观察器之前设置的值。
网友评论