iOS 輸入限制之 InputKit

InputKit-logo2-dynamic.gif

前言

最近接手了兩個(gè) O2O 的老項(xiàng)目,其中的 Bug 也不言而喻,單看項(xiàng)目中的布局就有 n 種不同的方式,有用純代碼的,有用 Masonry 的,有用 VFL 的,也有用 Xib 的,更有用代碼約束等等等,??。不扯遠(yuǎn)了,回歸正題。

由于這兩個(gè)項(xiàng)目是 O2O 項(xiàng)目,因此針對輸入組件的限制相比其他類型的項(xiàng)目要多一些,比如商品價(jià)格輸入(如:保留3位整數(shù),2位小數(shù)等)、買家留言字?jǐn)?shù)限制、不能輸入中文、不能輸入英文、只能輸入數(shù)字等等限制。

于是輸入限制 InputKit 誕生了!本文主要簡單介紹 InputKit 的使用及相關(guān)注意事項(xiàng)。(微博地址

InputKit

InputKit 是一個(gè)輕量級的,專門用于做輸入限制的第三方庫,靈感源自 BlocksKit,在項(xiàng)目中,主要為了解決三個(gè)問題:

  • 解耦
  • 需求
  • Bug

解耦

所謂解耦,即在開發(fā)項(xiàng)目中工程師不需要僅僅只為做個(gè)輸入限制,就在項(xiàng)目中到處寫 UITextFieldDelegate 協(xié)議中的方法,如:


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

只需繼承 InputKit 中的類即可,然后設(shè)置相關(guān)的限制屬性即可,無需設(shè)置 delegate。以 TXLimitedTextFieldTypePrice 類型為例,如:

Objective-C


// 創(chuàng)建 TXLimitedTextField 實(shí)例
TXLimitedTextField *textField = [[TXLimitedTextField alloc] initWithFrame:CGRectMake(20, 200, 100, 30)];
// 如 limitedType 不設(shè)置,默認(rèn) TXLimitedTextFieldTypeDefault
textField.limitedType = TXLimitedTextFieldTypePrice;
// 限制 10 的輸入長度
textField.limitedNumber = 10;
// 保留 5 位整數(shù)位
textField.limitedPrefix = 5;
// 保留 2 位小數(shù)位
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)

如果想設(shè)置 textField 的 delegate 也可以(即 textField.delegate = self),不會影響其限制功能,就像使用普通的 UITextField 一樣,毫無差異,非常方便。

Demo 截圖:

inputKit-demo-price.gif

需求

文章開頭提到過,需求即針對商品價(jià)格輸入(如:保留3位整數(shù),2位小數(shù)等)、買家留言字?jǐn)?shù)限制、不能輸入中文、不能輸入英文、只能輸入數(shù)字等等做限制。

如果針對上述的部分需求做定制鍵盤,是完全沒必要的,因?yàn)楣ぷ髁吭龆嗲也⒉荒軓脑搭^解決問題,比如:用戶使用粘貼功能、使用鍵盤提示文本等等,導(dǎo)致定制的鍵盤也是白搭。因此 InputKit 從源頭解決該問題,針對用戶的輸入進(jìn)行篩選并限制。比如我們只能讓用戶輸入中文:

Objective-C


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

// 自定義輸入限制類型
textField.limitedType = TXLimitedTextFieldTypeCustom;

// 限制最大輸入長度
textField.limitedNumber = 10;

// limitedRegExs 是一個(gè)數(shù)組類型的參數(shù),數(shù)組元素類型即正則表達(dá)式,如:kTXLimitedTextFieldChineseOnlyRegex 是一個(gè)常量,其值為:“^[\u4e00-\u9fa5]{0,}$”,即代表匹配中文的正則
textField.limitedRegExs = @[kTXLimitedTextFieldChineseOnlyRegex];

[self.view addSubview:textField];

Swift 代碼略

關(guān)于上述的正則表達(dá)式,在 InputKit 中的 TXMatchConst.h 頭文件中提供了一些常用的,比如:只能輸入數(shù)字、中文、字母等等,歡迎大家在 GitHub 上 PR。(注意:此處的正則表達(dá)式限制的是輸入源頭,而非結(jié)果!不然會導(dǎo)致用戶無法輸入。體會一下哈)。

Demo 截圖:

inputKit-demo-custom.gif

Bug

在沒使用 InputKit 之前,有時(shí)候,運(yùn)行到程序的某處,點(diǎn)擊輸入框,程序莫名其妙的卡死,過會兒就閃退了。相信不少人遇到過,后來發(fā)現(xiàn)是 self.delegate = self(self 即輸入框?qū)ο螅?導(dǎo)致的。注釋后,發(fā)現(xiàn)沒問題,打開后,程序又閃退,后來發(fā)現(xiàn)原來是 self.delegate = self 引起的死循環(huán),因此不得不注釋該句代碼。

上述的這些問題,如:在項(xiàng)目中 UITextFieldDelegate 協(xié)議方法遍地都是,以及一不小心使用了 self.delegate = self 時(shí),還會出現(xiàn)死循環(huán)等等,InputKit 都解決了。

使用 InputKit 后,self.delegate = self 程序不再卡死。(晚點(diǎn)會再發(fā)一篇軟文針對 self.delegate = self 的問題進(jìn)行剖析)。

至此,需求、Bug 均已解決。??

開源

GitHub 項(xiàng)目及 Demo 地址:https://github.com/tingxins/InputKit

有什么問題或者更好的建議,直接提 issue 或者 PR。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,141評論 25 708
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,491評論 1 23
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,627評論 30 472
  • “豆豆,如果讓你擔(dān)任班委你愿意嗎?” 那是一個(gè)深夜,班班的一句話在昏黑的夜晚瞬間讓我頭腦膨脹,腎上腺素極速上身。 ...
    我是牛陽陽閱讀 323評論 5 9
  • 首先聲明,我是女的,正常的女的。但是我就是更愛姑娘,欣賞的贊嘆的愛著。 我有一個(gè)好朋友,是我大學(xué)同...
    凌然閱讀 275評論 0 0

友情鏈接更多精彩內(nèi)容