当文本输入框和是否勾选在同一列表时,你懵圈了吗?

看着原型图时是不是已经无语!
慧合是仅仅展示成分含量及是否勾选, 而自购时不仅仅是需要回显这些内容, 还需要可输入文本内容 和 可勾选选项的操作!

对于这类,我们要淡定,先冷静处理,和产品沟通是否能更改为两个界面, 实在不能更改, 就只能来适应这个局势了,现将自购的界面来说,下面使用 MVC 设计模式来思路剖析!

Step1: Model里添加文本输入框的值valueStr 及 勾选项的是否选中 bool 值.

PS:当未碰触键盘,文本输入框值就默认为上次参数里的值

#import <Foundation/Foundation.h>

@interface XHHPremixModel : NSObject

@property (nonatomic, copy) NSString *id;

// 指标
@property (nonatomic, copy) NSString *name;

// 成分量
@property (nonatomic, assign) float value;

// 成分量 文本输入值
@property (nonatomic, copy) NSString *valueStr;

// 单位
@property (nonatomic, copy) NSString *unit;

// 是否选中
@property (nonatomic, assign, getter=isSelected) BOOL selected;

+ (NSArray *)loadPremixInfoFromJson:(NSArray *)array;

@end
#import "XHHPremixModel.h"
#import "MJExtension.h"

@implementation XHHPremixModel

+ (NSArray *)loadPremixInfoFromJson:(NSArray *)array {
    
    return [self objectArrayWithKeyValuesArray:array].copy;
}

- (NSString *)valueStr {
    
    if ([_valueStr isEqual:[NSNull null]] || _valueStr == nil) {
        _valueStr = [NSString stringWithFormat:@"%.2f", _value];
    }
    
    return _valueStr;
}

@end

Step2: Cell 里通过拿到标识去判断是文本输入框类型 还是 勾选项类型并创建.

下面摘取核心代码:
2.1 这里和后台商议的是通过单位值 unit 返回的是否是1, 1则为勾选项类型, 其他则为文本输入框类型.设置子控件位置里要注意两者的展现与否.

- (void)layoutSubviews {
    [super layoutSubviews];
    
    // 设置子控件位置
    [self setupFrame];
}

// 设置子控件位置
- (void)setupFrame {

    if ([self.model.unit isEqualToString:@"1"]) {
        
        self.elementTextField.hidden = YES;
        self.selectImg.hidden = NO;
    } else {
        self.elementTextField.hidden = NO;
        self.selectImg.hidden = YES;
    }

}

2.2 model 赋值里要记得判断: 当为勾选项时,在选中状态下,赋值文本输入框valueStr为1,且更换选中图片; 在取消选中状态下,赋值文本输入框valueStr为0,且更换未选图片.

// model赋值
- (void)setModel:(XHHPremixModel *)model {
    
    _model = model;
    
    self.norm.text = model.name;
    self.elementTextField.text = [NSString stringWithFormat:@"%.2f%@", model.value, model.unit];
    
    if ([model.unit isEqualToString:@"1"]) { // 勾选项类型
        if (model.selected == YES) { // 选中
            model.valueStr = @"1";
            self.selectImg.image = [UIImage imageNamed:@"xz"];
        } else {
            model.valueStr = @"0";
            self.selectImg.image = [UIImage imageNamed:@"wx"];
        }
    }
}

2.3 文本输入框类型的赋值


#pragma mark- UITextFieldDelegate

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if (textField == self.elementTextField) {
        [self.elementTextField resignFirstResponder];
    }
    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField {
    
    self.elementTextField.text = textField.text;
    self.model.valueStr = [NSString stringWithFormat:@"%@", textField.text];

    XHHLog(@"输入了成分%@", self.elementTextField.text);
}

// 限制两位小数
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    
    if ([textField.text containsString:@"."]) {
        if ([string isEqualToString:@"."]) return NO;
        NSRange rangeOfPoint = [textField.text rangeOfString:@"."];
        if (range.location > rangeOfPoint.location + 2) return NO;
    }
    
    return YES;
}

PS: 因界面中包含了选择勾选项,不要在 cell 里去收起键盘操作, 会影响勾选操作!也就是说,不要调起这个方法: touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event, 可以在控制器里选中当前行时视图退出编辑状态(收起键盘).

Step3:Controller 里 点击操作 及 数据回显

3.1 点击选中及收起键盘操作
这个时候不能使用手势方法去让视图退出编辑状态(收起键盘),还是因为界面中包含了选择勾选项,会有手势冲突现象.

// 选中当前行
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    XHHPremixModel *model = self.list[indexPath.row];
    
    // 处理勾选性问题, 选中赋值为1
    if ([model.unit isEqualToString:@"1"]) {
      
        // 编辑状态 点击选中
        model.selected = !model.selected;
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

    // 视图退出编辑状态(收起键盘)
    [self.view endEditing:YES];
}

3.2 勾选读取数据回显
可以在读取 List 列表数据请求里时, 去遍历显示模型中原本已勾选值,和后台协议为,当 value 值为0时,则为未选状态,其他值则为选中状态.

NSArray *currentPageArray = [XHHPremixModel loadPremixInfoFromJson:json[@"data"][@"list"]];
[weakSelf.list addObjectsFromArray:currentPageArray];

// 遍历显示模型中原本已勾选值
for (XHHPremixModel *model in currentPageArray) {
    if (model.value != 0) {
        model.selected = YES;
    } else {
        model.selected = NO;
    }
}

此文仅以介绍思路, 毕竟这样 APP 奇葩的页面很少, iOS 的 更少!

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

推荐阅读更多精彩内容