先上个图片,因为本录屏是请求的真实数据,所以没有全屏录制
这个是16年那时候的版本。那时候业务逻辑简单,界面只有三个。
下面介绍下这个钱包。
分为定期理财,活期理财,个人信息三大界面
里面集成了有十来个银行的支付通道接口。
随着业务的扩大,现在里面的通道又增加了。
一、工资单逻辑分析
月份日历展示,可以显示每年12个月,而且当前月之后的月份是置灰不可点击的。
上面的按钮可以切换年
日历消失后,下面也有按钮来切换月份
如果遇到某月 人力没有上传工资单,就提示“本月暂时没有工资单”
这个里面 实现也很简单,主要是设置几个全局变量,来实现不同view的数据联动
二、部分工资单的代码
这个完全是本人一个字母一个字母写出来的
时间久了,也不优化了,纯属给大家提供个思路
部分代码如下
首先要引入头文件
#import "SalaryViewController.h"
#import "SalaryBillTableViewCell.h"
#import "BQAlertView.h"
@interface SalaryViewController ()<UIScrollViewDelegate,UITableViewDataSource,UITableViewDelegate>
需要多处引用的按钮等控件设置成全局变量,好的习惯应该是 把每个按钮都写成英文形式 ,而不能向下面那样写 lab1 lab2等,这样在过了一段时间后会很难读懂。这里为了保证程序运行,就不费时间改回来了,主要目的是告诉大家如何使代码变得整洁 易读
写程序最重要的注意它的 可读性(可读性强了,可维护性才高) 鲁棒性 可扩展性
命名要类似这个 这个 一看就是 当前月份的工资数目(因为当时需求定的可能一个月有多个工资单,所以设置一个这个变量来作为扩展备用)
@property(nonatomic,assign)int currentMonthSalaryNum;
@end
@implementation SalaryViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
这里一目了然,第一部分创建界面
[self creatUI];
第二部分展示数据
[self showSalaryAtDate:@""];
}
-(void)showSalaryAtDate:(NSString *)datea{
if ([self serverIsReachable]) {
请求数据 成功后 刷新 工资单
}else {
[self connectFailed];
[self hideBgView];
}
}
可以理解为刷新数据的 方法
-(void)resetUI3{
// 这个lab 仅仅是 tableView3 的标题
for (UITableView * view in self.salaryView1.subviews) {
//因为当时需求 每个月算上奖金,可能有多个工资单 需要做成左右滑动的形式,因此,准备了三个table,想要用来 循环利用(类似三张轮播图无限循环轮播的原理) 后来,安卓那个哥们说做不了左右滑动的形式,得了为了保持统一,我就也不做了就只留了个tableView3,tableView1和tableView2注释掉,留着万一日后扩展用。其实这个命名还可以改下,比如 改成 self.salaryTableView3
if (view != self.tableView3) {
[view removeFromSuperview];
}
}
if (self.currentMonthSalaryNum > 1) {
self.salaryView1.pagingEnabled = YES;
for (int i = 1; i< self.currentMonthSalaryNum; i++) {
UITableView * tableView = [self createTableViewWithFrame:CGRectMake(i*kScreenWidth, 0, kScreenWidth, self.salaryView1.size.height) andTag:(i + 3) andGongZiNum:(i + 1)];
[self.salaryView1 addSubview:tableView];
}
lab.text = @"工资单1";
多个工资单 显示左右切换工资单 按钮
}else{
lab.text = @"工资单";
单个工资单 不显示左右切换工资单 按钮
}
}
-(void)reloadTableViewData{
self.tableView3.contentOffset = CGPointMake(0, 0);
for(UIView * view in self.salaryView1.subviews){
if ([view isKindOfClass:[UITableView class]]) {
[(UITableView *)view reloadData];
}
}
}
//创建初始控件 这个最好优化成懒加载的形式
-(void)creatUI{
self.salaryView1 = [[UIScrollView alloc]initWithFrame:CGRectMake(0, kScreenWidth*311/750.0, kScreenWidth, kScreenHeight - 64 - kScreenWidth*311/750.0)];
[self.view addSubview:self.salaryView1];
self.tableView3 = [self createTableViewWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight - 64 - kScreenWidth*311/750.0) andTag:3 andGongZiNum:1];
[self.salaryView1 addSubview:self.tableView3];
}
#pragma mark 简洁创建 UITableView
-(UITableView *)createTableViewWithFrame:(CGRect)frame andTag:(NSInteger)tag andGongZiNum:(int)num {
UITableView * tableView = [[UITableView alloc]initWithFrame:frame style:UITableViewStyleGrouped];
tableView.dataSource = self;
tableView.delegate = self;
有多个工资单的时候 显示 是 第几个工资单
if (num > 1) {
lab.text = [NSString stringWithFormat:@"工资单%d", num];
}else{
lab.text = @"工资单";
}
[view addSubview:lab];
return tableView;
}
-(void)lastBill{
int x = self.salaryView1.contentOffset.x;
if (x > 0) {
x -= kScreenWidth;
self.salaryView1.contentOffset = CGPointMake(x, 0);
}
}
-(void)nextBill{
int x = self.salaryView1.contentOffset.x;
if (x < (self.currentMonthSalaryNum - 1)*kScreenWidth) {
x += kScreenWidth;
self.salaryView1.contentOffset = CGPointMake(x, 0);
}
}
#pragma mark 显示日历
-(void)showCalendar{
}
-(void)hideBgView{
}
#pragma mark 点击左右按钮之后的方法调用
-(void)backToLastMonth{
}
-(void)gotoNextMonth{
}
-(void)backToLastYear{
}
-(void)gotoNextYear{
}
-(void)btnClick:(NeeButton *)btn{
}
-(void)reLoadBtn{
}
-(NSString *)getSysDate{
return [NSString stringWithFormat:@"%@%@",[self getSysYear], [self getSysMonth]];
}
-(NSString *)getSysYear{
}
-(NSString *)getSysMonth{
}
#pragma mark 跳到工资流水
-(void)gotoGZWater{
// NSLog(@"shui water");
if (![InfoModel getInstance].isLoginSucceed) {
[self checkLogin];
return;
}
if (self.data == nil) {//如果活期产品没有 提示用户
[SGInfoAlert showInfo:@"数据错误,请重试" bgColor:[[UIColor darkGrayColor] CGColor] inView:[[[UIApplication sharedApplication] delegate] window] vertical:0.7];
return;
}
if ([self serverIsReachable]) {
NSDictionary *dict = @{
@"USER_NAME":[InfoModel getInstance].NAME,
@"ID_NO":[InfoModel getInstance].ID_NO,
@"PROFLAG" : @"1"
};
JSWebViewController *vc = [[JSWebViewController alloc] initWithPath:HTML_DetailQuery/*[[MenuManager getInstance].menuDict objectForKey:@"交易记录"]*/ data:dict];
vc.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:vc animated:YES];
}
else {
[self connectFailed];
}
}
- (void)setLeftBarButtonItem {
}
#pragma mark - 代理
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 0.01;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 0;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
return cell;
}
这个是准备放了三个table在scroll里面左右滑动用的,结果没用到,但是要留着以防以后需求变更
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
}
@end
上面的代码仔细研究的话还有很多需要优化的。本次 主要给大家分享下,界面的一般写法。如何巧妙的联动数据。
关于如何规范代码书写,有很多人有很多规范。
基本的规范可以参考这个:
https://www.cnblogs.com/isItOk/p/8550989.html
希望对大家有用。
这个是纯手写,有需要的欢迎转载