zoukankan      html  css  js  c++  java
  • 项目小分析------从 优普钱包工资单 谈代码的规范性和界面的一般写法

    先上个图片,因为本录屏是请求的真实数据,所以没有全屏录制

    这个是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

    希望对大家有用。

    这个是纯手写,有需要的欢迎转载

  • 相关阅读:
    asp结合swf外调代码
    loadMovie与loadMovieNum区别
    行业常用名词及缩写定义
    用javascript 控制跳转页面
    jdk源码整数和字符串间的转换
    动态代理动态生成java文件并编译成class文件
    JDK源码分析——动态代理源码(Proxy类)
    策略模式与工厂模式比较
    Java编程:常见问题汇总
    工厂方法与抽象工厂的区别
  • 原文地址:https://www.cnblogs.com/isItOk/p/7498852.html
Copyright © 2011-2022 走看看