2011-12-13 26 views
8

Tôi đang viết xác nhận cho trường văn bản của mình, tôi thấy điều thú vị là liệu tôi có thể kiểm tra số lượng chữ tôi đang nhập vào trường văn bản ở thời gian thực hay không. Đầu vào trường văn bản của tôi phải có 8 chữ số. Vì vậy, tôi muốn thay đổi văn bản bên trong trường văn bản thành màu xanh lục khi tôi đạt đến 8 chữ số và thay đổi màu khi không.Làm thế nào để kiểm tra đầu vào trường văn bản tại thời gian thực?

Tôi có thể làm như thế nào? Xin hãy giúp tôi, cảm ơn trước.

Trả lời

21

Sử dụng -textField:shouldChangeCharactersInRange:replacementString: có lẽ là một giải pháp tồi vì nó kích hoạt trước khi cập nhật trường văn bản. Phương pháp này có lẽ nên được sử dụng khi bạn muốn thay đổi văn bản của trường văn bản trước khi bàn phím tự động cập nhật nó. Ở đây, có thể bạn muốn chỉ cần sử dụng mục tiêu hành động cặp đôi khi chỉnh sửa thay đổi giá trị:

[textField addTarget:self action:@selector(checkTextField:) forControlEvents:UIControlEventEditingChanged]; 

Sau đó, trong - (void)checkTextField:(id)sender, hãy thử này:

UITextField *textField = (UITextField *)sender; 
if ([textField.text length] == 8) { 
    textField.textColor = [UIColor greenColor]; // No cargo-culting please, this color is very ugly... 
} else { 
    textField.textColor = [UIColor blackColor]; 
    /* Must be done in case the user deletes a key after adding 8 digits, 
     or adds a ninth digit */ 
} 
+0

Đây chắc chắn là giải pháp tốt nhất. Tôi đã có vấn đề off-by-one bằng cách sử dụng '-textField: shouldChangeCharactersInRange: replaceString:' –

+0

Có! Hãy nhớ rằng khi phương thức đó được gọi, văn bản của trường văn bản vẫn chưa thay đổi. – aopsfan

+0

Đồng ý, giải pháp tốt hơn nhiều so với bất kỳ thứ gì khác tôi đã thấy! – jcrowson

1

Thiết lập một đại biểu cho UITextField và thực hiện các phương pháp – textField:shouldChangeCharactersInRange:replacementString: Các chi tiết và ví dụ là trong UITextFieldDelegate Protocol Reference, nhưng đây là một ví dụ nhanh:

- (BOOL)textField:(UITextField *)textField 
shouldChangeCharactersInRange:(NSRange)range 
replacementString:(NSString *)string 
{ 
     NSString *text = [textField text]; 
     // NOT BACKSPACE 
     if ([string length] || text.length + string.length < 8) { 
      return YES; 
     } else if (text.length + string.length > 8) { 
      return NO; 
     } else { 
       // DO SOMETHING FOR LENGTH == 8 
       return YES; 
     } 
} 
3

Sử dụng UITextFieldDelegate. đặc biệt là chức năng này

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

và bạn có thể nhận được mã liên kết mẫu từ here ..

+0

Giải pháp được chấp nhận tốt hơn vì @aopsfan đề cập: 'Sử dụng -textField: shouldChangeCharactersInRange: replaceString: có lẽ là một giải pháp tồi vì nó kích hoạt trước khi trường văn bản cập nhật.' Do đó, bạn mất yêu cầu" thời gian thực "và các bản cập nhật là một ký tự đằng sau (off-by-one). –

2
[textField addTarget:self action:@selector(checkTextField) forControlEvents:UIControlEventEditingChanged]; 

Hãy thử nó!

4
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string]; 

// [textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]]; 
    NSLog(@"%@",searchStr); 
    return YES; 
} 
0

Cập nhật Swift 4,0

txtFieldAdd.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged) 

Bây giờ gọi chức năng của bạn. Trong trường hợp của tôi, điều này sẽ cho phép nút lưu

@objc func textFieldDidChange(_ textField: UITextField) { 
    if (txtFieldAdd.text?.isEmpty)! { 
     btnSave.isEnabled = false 
    } 
    else { 
     btnSave.isEnabled = true 
    } 
} 

Hy vọng điều đó sẽ hữu ích.

Các vấn đề liên quan