当前位置: 首页 > news >正文

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

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

对于这类,我们要淡定,先冷静处理,和产品沟通是否能更改为两个界面, 实在不能更改, 就只能来适应这个局势了,现将自购的界面来说,下面使用 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 的 更少!

相关文章:

  • 01月03日三周二次【Python基础进阶】
  • linux下SVN忽略文件/文件夹的方法
  • Docker Registry Server 搭建,配置免费HTTPS证书,及拥有权限认证、TLS 的私有仓库
  • 5 秒创建 k8s 集群 - 每天5分钟玩转 Docker 容器技术(115)
  • 9.2. Buffering and Caching
  • golang 新人入门配置学习
  • 63. 搜索旋转排序数组 II
  • JAVA NIO知识点总结(6)——DatagramChannel
  • addEventListener()的第三个参数可以传对象了
  • 11.11. SNMP
  • [2018-01-08] Python强化周的第一天
  • Zabbix备份数据文件
  • Shell 输入/输出重定向
  • 通用汽车新增130辆测试无人车,配激光雷达
  • 了解Web及网络基础(二)
  • 〔开发系列〕一次关于小程序开发的深度总结
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2017年终总结、随想
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • LintCode 31. partitionArray 数组划分
  • Node项目之评分系统(二)- 数据库设计
  • Selenium实战教程系列(二)---元素定位
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 从零开始学习部署
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 巧用 TypeScript (一)
  • 十年未变!安全,谁之责?(下)
  • Java数据解析之JSON
  • 仓管云——企业云erp功能有哪些?
  • 关于Android全面屏虚拟导航栏的适配总结
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (4)logging(日志模块)
  • (4.10~4.16)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (zt)最盛行的警世狂言(爆笑)
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • (自用)learnOpenGL学习总结-高级OpenGL-抗锯齿
  • .aanva
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • @ConditionalOnProperty注解使用说明
  • @SentinelResource详解
  • @Service注解让spring找到你的Service bean
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [<死锁专题>]
  • [04]Web前端进阶—JS伪数组
  • [2016.7.Test1] T1 三进制异或