這是專案中遇到的一個小功能,封裝的不是很好,主講自定義思路,如果你剛好也需要這種功能,建議將此demo作為參考,自己重新編寫。程式碼很簡單,利用textField自定義6位支付密碼輸入框,數字鍵盤利用button自定義,加兩個協議方法,用來傳值以及處理鍵盤響應事件。
17年8月換了工作地點,從武漢轉到了南京。新的工作環境,新的同事,新的氛圍,在團隊中的職能擔當也變了。之前是小公司職位更突出,現在是大公司,我成為了團隊中的一個小成員。(這種變動,情緒上難免會有些波動)我是一個新人,工作時間也不是很長,技術積累的也沒有那麼多。唯一能幫我改變現狀的只有我自己,我會靜下心來好好成長。
值得高興地是,我在武漢工作那段時間,利用工作間隙學習的js,swift,h5網頁互動,現如今派上了用場。我很高興能為團隊中其他成員解決問題,這應該就是我的價值所在吧,我會繼續努力的!
####本文於2017.12.31下午再次編輯,更新優化,自動識別6位密碼輸入。
####實現思路
既要記錄文字的輸入又要隨著delete實時減少文字。如果僅僅只是實現
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
這個協議方法,是不能做到同時處理這兩件事的。(既加又減,想想就矛盾)所以需要兩個獨立的方法去處理這兩件事。
####主要程式碼
1.處理輸入邏輯:
/*!
@method 密碼輸入時觸發的協議方法
@abstract 密碼輸入時觸發的協議方法,遍歷tf 進行賦值
@discussion 注意點,delete事件也會進入這個方法 但string是nil 所以會給要賦值的tf 置為nil, 符合delete邏輯。
@param textField textField
@result bool
*/
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
self.tipsLabel.text = @"請設定支付密碼";
for (UITextField *tf in self.tfArr) {
if ([tf.text isEqualToString:@""]||tf.text == nil) {
tf.text = string;
if (textField.text.length==5) {
[self textFieldShouldReturn:textField];
}
return YES;
}
}
return YES;
}
複製程式碼
2.處理刪除邏輯:
/*!
@method payPasswordTFDeleteEvent
@abstract 鍵盤delete觸發的協議方法
@discussion 自定義的協議方法,鍵盤delete觸發的協議方法。
*/
- (void)payPasswordTFDeleteEvent{
[self.tfArr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
UITextField *tf = (UITextField *)obj;
if (![tf.text isEqualToString:@""] && tf.text !=nil) {
tf.text = @"";
*stop = YES;
}
}];
}
複製程式碼
協議方法是自定義textField
實現deleteBackward
協議方法,監控鍵盤delete的點選。
####注意:
如果專案中使用了
IQKeyboardManager
請實現下面的方法,避免使用過程中出現問題:
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
[self.tfArr enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
UITextField *tf = (UITextField *)obj;
tf.text = @"";
}];
}
複製程式碼
轉載請註明出處 © XDChang