iOS 输入限制之 InputKit

InputKit-logo2-dynamic.gif

前言

最近接手了两个 O2O 的老项目,其中的 Bug 也不言而喻,单看项目中的布局就有 n 种不同的方式,有用纯代码的,有用 Masonry 的,有用 VFL 的,也有用 Xib 的,更有用代码约束等等等,🐮。不扯远了,回归正题。

由于这两个项目是 O2O 项目,因此针对输入组件的限制相比其他类型的项目要多一些,比如商品价格输入(如:保留3位整数,2位小数等)、买家留言字数限制、不能输入中文、不能输入英文、只能输入数字等等限制。

于是输入限制 InputKit 诞生了!本文主要简单介绍 InputKit 的使用及相关注意事项。(微博地址

InputKit

InputKit 是一个轻量级的,专门用于做输入限制的第三方库,灵感源自 BlocksKit,在项目中,主要为了解决三个问题:

  • 解耦
  • 需求
  • Bug

解耦

所谓解耦,即在开发项目中工程师不需要仅仅只为做个输入限制,就在项目中到处写 UITextFieldDelegate 协议中的方法,如:


- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Coding
}

只需继承 InputKit 中的类即可,然后设置相关的限制属性即可,无需设置 delegate。以 TXLimitedTextFieldTypePrice 类型为例,如:

Objective-C


// 创建 TXLimitedTextField 实例
TXLimitedTextField *textField = [[TXLimitedTextField alloc] initWithFrame:CGRectMake(20, 200, 100, 30)];
// 如 limitedType 不设置,默认 TXLimitedTextFieldTypeDefault
textField.limitedType = TXLimitedTextFieldTypePrice;
// 限制 10 的输入长度
textField.limitedNumber = 10;
// 保留 5 位整数位
textField.limitedPrefix = 5;
// 保留 2 位小数位
textField.limitedSuffix = 2;
[self.view addSubview:textField];

Swift


let textField = LimitedTextField(frame: CGRect(x: 20, y: 200, width: 100, height: 30))
textField.limitedType = .price
textField.limitedNumber = 10
textField.limitedPrefix = 5
textField.limitedSuffix = 2
view.addSubview(textField)

如果想设置 textField 的 delegate 也可以(即 textField.delegate = self),不会影响其限制功能,就像使用普通的 UITextField 一样,毫无差异,非常方便。

Demo 截图:

inputKit-demo-price.gif

需求

文章开头提到过,需求即针对商品价格输入(如:保留3位整数,2位小数等)、买家留言字数限制、不能输入中文、不能输入英文、只能输入数字等等做限制。

如果针对上述的部分需求做定制键盘,是完全没必要的,因为工作量增多且并不能从源头解决问题,比如:用户使用粘贴功能、使用键盘提示文本等等,导致定制的键盘也是白搭。因此 InputKit 从源头解决该问题,针对用户的输入进行筛选并限制。比如我们只能让用户输入中文:

Objective-C


TXLimitedTextField *textField = [[TXLimitedTextField alloc] initWithFrame:CGRectMake(20, 200, 100, 30)];

// 自定义输入限制类型
textField.limitedType = TXLimitedTextFieldTypeCustom;

// 限制最大输入长度
textField.limitedNumber = 10;

// limitedRegExs 是一个数组类型的参数,数组元素类型即正则表达式,如:kTXLimitedTextFieldChineseOnlyRegex 是一个常量,其值为:“^[\u4e00-\u9fa5]{0,}$”,即代表匹配中文的正则
textField.limitedRegExs = @[kTXLimitedTextFieldChineseOnlyRegex];

[self.view addSubview:textField];

Swift 代码略

关于上述的正则表达式,在 InputKit 中的 TXMatchConst.h 头文件中提供了一些常用的,比如:只能输入数字、中文、字母等等,欢迎大家在 GitHub 上 PR。(注意:此处的正则表达式限制的是输入源头,而非结果!不然会导致用户无法输入。体会一下哈)。

Demo 截图:

inputKit-demo-custom.gif

Bug

在没使用 InputKit 之前,有时候,运行到程序的某处,点击输入框,程序莫名其妙的卡死,过会儿就闪退了。相信不少人遇到过,后来发现是 self.delegate = self(self 即输入框对象) 导致的。注释后,发现没问题,打开后,程序又闪退,后来发现原来是 self.delegate = self 引起的死循环,因此不得不注释该句代码。

上述的这些问题,如:在项目中 UITextFieldDelegate 协议方法遍地都是,以及一不小心使用了 self.delegate = self 时,还会出现死循环等等,InputKit 都解决了。

使用 InputKit 后,self.delegate = self 程序不再卡死。(晚点会再发一篇软文针对 self.delegate = self 的问题进行剖析)。

至此,需求、Bug 均已解决。👀

开源

GitHub 项目及 Demo 地址:https://github.com/tingxins/InputKit

有什么问题或者更好的建议,直接提 issue 或者 PR。

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,395评论 25 707
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 5,160评论 1 23
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,121评论 29 470
  • “豆豆,如果让你担任班委你愿意吗?” 那是一个深夜,班班的一句话在昏黑的夜晚瞬间让我头脑膨胀,肾上腺素极速上身。 ...
    我是牛阳阳阅读 278评论 5 9
  • 首先声明,我是女的,正常的女的。但是我就是更爱姑娘,欣赏的赞叹的爱着。 我有一个好朋友,是我大学同...
    凌然阅读 205评论 0 0