一句話設定UITextField、UITextview的字數限制和placeholder

劇情的需要發表於2017-09-27

在開發中UITextField和UITextview這兩個元件用的是非常頻繁的,而且還要限制輸入框的字數,UITextview要設定placeholder等,每個控制元件都要實現代理方法寫相應的邏輯程式碼。是不是很麻煩?

很多新手是這樣寫的:

// 限制字數
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    if ([text isEqualToString:@""]) {
        return YES;
    }
    if (textView.text.length > 5) {
        return NO;
    }
    return YES;
}複製程式碼

這樣寫會有問題,當輸入中文或貼上字元到文字框時問題就出來了。

#為此我重寫了UITextField和UITextview,實現一句話設定限制字數和placeholder。代理用block代替,使用更加方便靈活。

限制字數相關實現,完美解決剛提到的問題(UITextField和UITextview的實現思路一樣):

if (self.limitLength > 0) { // 限制長度
        //獲取高亮部分
        UITextRange *selectedRange = [textView markedTextRange];
        UITextPosition *position = [textView positionFromPosition:selectedRange.start offset:0];

        // 沒有高亮選擇的字,則對已輸入的文字進行字數統計和限制
        if (!position)
        {
            if (toBeString.length > self.limitLength)
            {
                NSRange rangeIndex = [toBeString rangeOfComposedCharacterSequenceAtIndex:self.limitLength];
                if (rangeIndex.length == 1)
                {
                    textView.text = [toBeString substringToIndex:self.limitLength];
                }
                else
                {
                    NSRange rangeRange = [toBeString rangeOfComposedCharacterSequencesForRange:NSMakeRange(0, self.limitLength)];
                    textView.text = [toBeString substringWithRange:rangeRange];
                }
            }
        }
    }複製程式碼

效果圖:

效果圖
效果圖

使用:

JHTextField *textField = [[JHTextField alloc] initWithFrame:CGRectMake(50, 50, 300, 44)];
    textField.limitLength = 5;
    textField.placeholder = @"請輸入~";
    textField.layer.borderWidth = 1;
    textField.layer.borderColor = [UIColor lightGrayColor].CGColor;
    [self.view addSubview:textField];

    JHTextView *textView = [[JHTextView alloc] initWithFrame:CGRectMake(50, 120, 300, 200)];
    textView.limitLength = 10;
    textView.placeholder = @"請輸入~";
    textView.layer.borderWidth = 1;
    textView.layer.borderColor = [UIColor lightGrayColor].CGColor;
    [self.view addSubview:textView];
    self.textView = textView;複製程式碼

demo地址:github.com/iOSHJH/Inpu…

另外說到輸入框必然就會想到鍵盤擋住輸入框怎麼辦?為此我隆重介紹一個輕量級的鍵盤管理器,一句話設定當前控制器的view跟隨鍵盤起伏,媽媽再也不用擔心鍵盤擋住輸入框了,地址:juejin.im/post/59cb75…

有問題歡迎issues,若專案對你有用還望不吝給個star讓我動力十足?

相關文章