标签:ios
最近一直在做项目,在项目中呢也遇到了某些问题,比如为一个状态点赞或者是踩,那么按钮的状态会随之改变,但是这个过程是要发送请求的,也就是说我们要在请求回来以后才改变状态,于是小弟就有了一个大胆的想法,那么我的这个想法呢,就是以交互为主,开发逻辑为辅,让交互设计融入开发代码之中,所以我称它为:交互式开发思想,希望可以帮助小伙伴哦
主要就是下面这两个图的效果,也就是点击的时候让它有反应,当请求过后还要再次回调进来,比如请求成功,我们就不用改变它的状态,但是请求失败,我们就要将原来的状态改变,而我们正常的做法其实是点击的时候有一个动画出来,然后请求成功后,状态改变,失败,则状态不变,对应Label上的数字的值也不做改变,但为了方便一点,就没有做动画
废话不多说,先看代码
这里的难点在于如何巧妙的运用Delegate以及Block来做这些事情,那么我们就先定义一个Block吧
typedef void(^ButtonBlock)(BOOL isChanged);
然后写一个Delegate,然后在方法里面添加Block当参数
- (void)tableViewCell:(SWHTableViewCell *)cell didTappedButton:(UIButton *)button block:(ButtonBlock)block;
有些时候写代码为什么要分好模块,就是因为我们要遵循MVC的架构模式,这样将代码的耦合度降到最低,也方便我们后期对其很好的维护,对于代码质量相关的帖子,我会每个月更新一次的哦
接下来我们来看看在Up按钮事件里面要做的事情
- (void)upActionButton:(UIButton *)button { if ([self isButtonTypeChanged]) { return; } [button setBackgroundColor:[UIColor redColor]]; [self.model setButtonUpType:SWHButtonTypeUp]; [self.numLabel setText:[NSString stringWithFormat:@"%ld", ++self.model.num]]; __weak SWHTableViewCell *weakSelf = self; if ([self.delegate respondsToSelector:@selector(tableViewCell:didTappedButton:block:)]) { [self.delegate tableViewCell:self didTappedButton:button block:^(BOOL isChanged) { }]; } }
接下来我们用一个假数据来模仿一次网络请求,我这里用的是delay方法
- (BOOL)delayRequest { NSInteger num = random() % 2; if (num) { NSLog(@"请求网络成功"); return YES; } NSLog(@"请求网络失败"); return NO; }
接下来我们再利用delay方法里面的返回值来改写这个block参数
- (void)tableViewCell:(SWHTableViewCell *)cell didTappedButton:(UIButton *)button block:(ButtonBlock)block { __weak ViewController *weakSelf = self; __block ButtonBlock newBlock = block; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ newBlock([weakSelf delayRequest]); }); }
然后我们再根据参数来回调block到UpAction里面,所有的Cell相关的UI都要放在Cell里面来做
__weak SWHTableViewCell *weakSelf = self; if ([self.delegate respondsToSelector:@selector(tableViewCell:didTappedButton:block:)]) { [self.delegate tableViewCell:self didTappedButton:button block:^(BOOL isChanged) { if (!isChanged) { [button setBackgroundColor:[UIColor yellowColor]]; [weakSelf.numLabel setText:[NSString stringWithFormat:@"%ld", --weakSelf.model.num]]; [weakSelf.model setButtonUpType:SWHButtonTypeNone]; } }]; }
没错,你会发现,这样会把耦合度降到最低
在下一期的代码质量提高的帖子里面,我会将这期的大部分代码写进去,让我们任性的提高我们的代码质量,而不是惰性的提高它们哦
如有任何技术相关的问题,请来群里提问并分享,让我们一起任性的进步
本文出自 “东软iOS校友群的技术博客” 博客,请务必保留此出处http://neusoftios.blog.51cto.com/9977509/1635771
标签:ios
原文地址:http://neusoftios.blog.51cto.com/9977509/1635771