2015-03-25 4 views
4

У меня так много UITextFiled в моем приложении.Runtime Атрибут UITextFiled

Я не хочу, чтобы пользователь вводил специальные символы в эти текстовые файлы.

Я знаю, я могу использовать shouldChangeCharactersInRange метод делегата от UITextFiled и проверить его, но этот подход осуществим для 5-8 UITextFiled не 15-20.

Я хочу, чтобы подтвердить эти (15-20) UITextFileds использованием RuntimeAttributes и UICategory ниже ссылок: -

http://johannesluderschmidt.de/category-for-setting-maximum-length-of-text-in-uitextfields-on-ios-using-objective-c/3209/

http://spin.atomicobject.com/2014/05/30/xcode-runtime-attributes/

Я попытался и создайте UICategory из UITextFiled, как показано ниже:

UITextField + RunTimeExtension.h

@interface UITextField (RunTimeExtension) 

@property(nonatomic,assign) BOOL *isAllowedSpecialCharacters; 

@end 

UITextField + RunTimeExtension.m

-(void)setIsAllowedSpecialCharacters:(BOOL *)isAllowedSpecialCharacters{ 

-(BOOL)isIsAllowedSpecialCharacters{ 
    if(self.isAllowedSpecialCharacters){ 
     NSCharacterSet *characterSet = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 

     NSString *filtered = [[self.text componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@""]; 

     return [self.text isEqualToString:filtered] || [self.text isEqualToString:@" "]; 
    }else{ 
     return NO; 
    } 
} 

и добавить этот атрибут в RuntimeAttribute, как показано ниже картинки:

Runtime Attribute

Но не работает, если это свойство проверено или нет.

Пожалуйста, помогите мне, я застрял с последних 1-2 дней.

Цените свое время. Заранее спасибо.

+0

Вы проверили мой ответ? –

ответ

1

Есть много ошибок в коде. См. Мой ответ на исправления.

UITextField + SpecialCharacters.h

#import <UIKit/UIKit.h> 

@interface UITextField (SpecialCharacters) 

@property(nonatomic,assign) NSNumber *allowSpecialCharacters; 
//here you were using BOOL * 

@end 

UITextField + SpecialCharacters.м

#import "UITextField+SpecialCharacters.h" 
#import <objc/runtime.h> 

@implementation UITextField (SpecialCharacters) 

static void *specialCharKey; 

-(void) setAllowSpecialCharacters:(NSNumber *)allowSpecialCharacters{ 

    objc_setAssociatedObject(self, &specialCharKey, allowSpecialCharacters, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 

} 

-(NSNumber *) allowSpecialCharacters{ 

    return objc_getAssociatedObject(self, &specialCharKey); 
} 

@end 

Всегда устанавливать имена для геттер и сеттер в соответствии со стандартами.

В вашем ViewController, установить делегат для текстового поля и реализовать следующий метод делегата согласно вашему требованию:

-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    if([textField.allowSpecialCharacters boolValue]){ 
     NSCharacterSet *characterSet = [[NSCharacterSet alphanumericCharacterSet] invertedSet]; 

     NSString *filtered = [[textField.text componentsSeparatedByCharactersInSet:characterSet] componentsJoinedByString:@""]; 

     return [textField.text isEqualToString:filtered] || [textField.text isEqualToString:@" "]; 
    }else{ 
     return NO; 
    } 
} 

В раскадровке/пере, вы должны установить атрибут во время выполнения, как и в снимке. Вы можете установить значение 1 или 0 согласно вашему требованию.

enter image description here

Это работает отлично на моей стороне. Надеюсь, он решает вашу проблему. Благодарю.

+0

Что делать, если я использую shouldChangeCharactersInRange в категории.? –

+0

Это метод делегата, а не текстовое поле метода. – NightFury

+0

Okk .. Спасибо @iAnum –

1

Почему бы не создать настраиваемое текстовое поле MyCustomTextField extends UITextField и использовать это поле при необходимости?

Дайте мне знать, если вам нужно больше деталей.

+0

Нет, я не хочу использовать обычай. Я хочу использовать только RuntimeAttribute. –

0

Вы можете использовать нижеследующий пользовательский класс для удовлетворения всех ваших требований. Он использует регулярные выражения для проверки textField, которые вы можете редактировать, чтобы обрабатывать shouldChangeCharactersInRange в соответствии с вашим регулярным выражением.

https://github.com/tomkowz/TSValidatedTextField