iOS 优化VC之自定义cell(一)

年后回来上了个新版本,主要是添加自动投标功能。因为工期紧,只是把功能实现了,没有考虑太多的结构优化。大部分的subview和逻辑都放在了vc里面,这样的恶果是出了问题,特别难定位,一团乱。故乘刚发完新版 新功能又还没确定间隙,初步把该功能vc优化了下。


效果图

大致思路

自定义cell(cell里面根据row不同,设置cell上不同的subview);
vc将默认信息model传给自定义cell;
自定义cell将用户输入的信息回调给vc;
最后vc处理相应逻辑,请求后台接口。

涉及到的控件:textfield,pickview(集成开源三方),button互斥,uiswich等

ViewController(简称vc)核心代码

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    AutoInvesCustomCell *cell = [AutoInvesCustomCell cellWithTableView:tableView indexPath:indexPath];
    cell.investInfo = investInfo;
    
    cell.blockPick = ^(NSString *strResult, NSInteger row, AutoInvesCustomCell *cell) {
        if (row == 1) {
            strRate = strResult;
            cell.lbRate.text = strResult;
        }else{
            strMonth = strResult;
            cell.lbMonth.text = strResult;
        }
    };
    
    cell.blockBidType = ^(NSInteger tag, BOOL isSelected) {
        isBidQrb = ((tag == 101 && isSelected) ? YES:NO);
        isBidXiny = ((tag == 102 && isSelected) ? YES:NO);
        if (tag == 100 && isSelected) {
            isBidQrb = YES;
            isBidXiny = YES;
        }
    };
    
    cell.blockAmount = ^(NSString *text) {
        strAmount = text;
    };
    
    cell.blockAllAmount = ^(BOOL isOn) {
        isRichMan = isOn;
        //开启全投后 对tf的处理
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:1];
        AutoInvesCustomCell *tfCell = [tableView cellForRowAtIndexPath:indexPath];
        tfCell.tfAmount.enabled = !isRichMan;
        tfCell.tfAmount.text = isRichMan? @"全投":strAmount;
    };
    
    return cell;
}

自定义cell头文件(AutoInvesCustomCell.h)

#import <UIKit/UIKit.h>
#import "AutoInvestModel.h"

#define AddBottomLine(view)  CGFloat lineHeight = 0.5f;\
CGRect lineFrame = CGRectMake(ContentX, HeightNormalCell-lineHeight, kScreenWidth-2*ContentX, lineHeight);\
UIView *lineNavBottom = [[UIView alloc] initWithFrame:lineFrame];\
lineNavBottom.backgroundColor = kColorLineSeperator;\
[view addSubview:lineNavBottom];

//宏定义

@class AutoInvesCustomCell;

typedef void(^BidTypeCellBlock)(NSInteger tag,BOOL isSelected);
typedef void(^AllAmountSWBlock)(BOOL isOn);
typedef void(^AmountTFBlock)(NSString *text);
typedef void(^PickViewBlock)(NSString *strResult,NSInteger row,AutoInvesCustomCell *cell);

@interface AutoInvesCustomCell : UITableViewCell
@property(strong,nonatomic)AutoInvestInfo *investInfo;
//UI控件属性
@property(nonatomic,copy)BidTypeCellBlock blockBidType;
@property(nonatomic,copy)AllAmountSWBlock blockAllAmount;
@property(nonatomic,copy)AmountTFBlock blockAmount;
@property(nonatomic,copy)PickViewBlock blockPick;

+ (instancetype)cellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath*)indexPath;
@end

自定义cell 实现文件(因篇幅有限,只摘取了大概框架代码)

+ (instancetype)cellWithTableView:(UITableView *)tableView indexPath:(NSIndexPath*)indexPath{
    static NSString *ID = @"cellID";
    AutoInvesCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if(!cell)
    {
        cell = [[AutoInvesCustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        
        cell.currIndexPath = indexPath;
        
        if (indexPath.section == 0) {
            [cell setupBannerCell];
        }
        if (indexPath.section == 2) {
            [cell setupAllCell];
        }
        if (indexPath.section == 1) {
            switch (indexPath.row) {
                case 0:
                    [cell setupAmount];
                    break;
                case 1:
                    [cell setupRate];
                    break;
                case 2:
                    [cell setupMonth];
                    break;
                case 3:
                    [cell setupBidMode];
                    break;
                default:
                    break;
            }
        }
    }
    
    return cell;
}

//banner
- (void)setupBannerCell{
}

//借款期限
- (void)setupMonth{
}

//期待年化收益率
- (void)setupRate{
}

//投资限定金额
- (void)setupAmount{
}

//全投开关
- (void)setupAllCell{
}

//标的种类
- (void)setupBidMode{
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{
    if (selected) {
        if (self.currIndexPath.row == 1
            || self.currIndexPath.row == 2)
            [self pickView:self.currIndexPath.row];
    }
}

#pragma mark- 用model填充cell
- (void)setInvestInfo:(AutoInvestInfo *)investInfo{
    if (!investInfo) {
        return;
    }
    //configcell
}

#pragma mark- 标的种类回调
- (void)btnClick:(UIButton *)btn{
    btn.selected = !btn.selected;
    if (self.blockBidType) {
        self.blockBidType(btn.tag,btn.selected);
    }
    //实现状态互斥功能
    for (UIButton *cBtn in arrBtn) {
        if (cBtn.tag != btn.tag) {
            cBtn.selected = NO;
        }
    }
}

#pragma mark- 限定金额回调
- (void)textFieldDone:(UIBarButtonItem *)tf{
    UIView *v = [self superview];
    if (![self.tfAmount.text isEqualToString:@"全投"]) {
        NSRange range = [self.tfAmount.text rangeOfString:@"0"];
        if (range.location == 0) {
            [MBProgressHUD showError:@"限定金额须大于50" toView:v];
            return;
        }
        if ([self.tfAmount.text doubleValue] <50) {
            [MBProgressHUD showError:@"限定金额须大于50" toView:v];
            return;
        }
    }
    
    if (self.blockAmount) {
        self.blockAmount(self.tfAmount.text);
    }
    
    [self endEditing:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField{
    
    textField.text = @"";
}

#pragma mark- 全投开关回调
- (void)swChange:(UISwitch *)sw{
    
    if (self.blockAllAmount) {
        self.blockAllAmount(sw.on);
    }
}

#pragma mark- 选择器(利率和期限)回调
- (void)pickView:(NSInteger)row
{
    NSArray *array1 = @[
                        @[@"不限",@"6%", @"7%", @"8%", @"9%", @"10%", @"11%", @"12%", @"13%", @"14%", @"15%", @"16%", @"17%", @"18%"],
                        @[@"不限",@"6%", @"7%", @"8%", @"9%", @"10%", @"11%", @"12%", @"13%", @"14%", @"15%", @"16%", @"17%", @"18%"]
                        ];
    NSArray *array2 = @[
                        @[@"不限",@"1个月", @"2个月", @"3个月", @"4个月", @"5个月", @"6个月", @"7个月", @"8个月", @"9个月", @"10个月", @"11个月", @"12个月"],
                        @[@"不限",@"1个月", @"2个月", @"3个月", @"4个月", @"5个月", @"6个月", @"7个月", @"8个月", @"9个月", @"10个月", @"11个月", @"12个月"]
                        ];
    BAKit_WeakSelf
    [BAKit_PickerView ba_creatCustomMultiplePickerViewWithDataArray:(row==1 ? array1:array2) configuration:^(BAKit_PickerView *tempView) {
        tempView.ba_pickViewTitleColor = BAKit_Color_Black_pod;
        // 自定义 pickview title 的字体
        tempView.ba_pickViewTitleFont = [UIFont boldSystemFontOfSize:15];
        // 可以自由定制 toolBar 和 pickView 的背景颜色
        //        tempView.ba_backgroundColor_toolBar = kColorWebBg;
        tempView.ba_backgroundColor_pickView = [UIColor whiteColor];
        tempView.animationType = BAKit_PickerViewAnimationTypeBottom;
        tempView.pickerViewPositionType = BAKit_PickerViewPositionTypeNormal;
        pickView = tempView;
    } block:^(NSString *resultString) {
        BAKit_StrongSelf
        //        BAKit_ShowAlertWithMsg_ios8(resultString);
        if (self.blockPick) {
            self.blockPick(resultString, row,self);
        }
    }];
}

感想

简单封装优化之后,后期若需扩展,就比较容易:
若更新UI 直接修改cell文件;
若修改相应逻辑 直接修改vc即可等
这样结构相对也比较清晰。

值得记录的问题:
1 button互斥
思路:遍历所有的button,若不是当前所选button,让其selected为NO
2 全投状态 更新限定金额输入框text及enable状态
思路:在开关的回调中拿到 输入框cell,之后再对该cell上的tf做相应更新([tb reload]是不行的)

不足处:
回调block太多;
cell不够明晰等
待后续更好的优化

后续:
其实后来想想这种static 不重用的cell ,封装一个带xib的tableview即可,没必要像上面那样自定义那么多cell

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容