2015-11-18 3 views
0

Я хочу создать категорию, которая работает так же, какКак создать категорию TextField

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

Преимущества этого метода он не позволяет пользователю вводить недопустимые символы.

Возможно ли управлять этим методом в категории TextFiled.

Приведенный ниже код подтверждает правильность текстового поля. Любой может помочь мне создать его категорию.

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

if (textField == NameText) 
    { 
     if ([string isEqualToString:@""]) 
     { 
      NSString *originalString = textField.text; 
      NSInteger newLength = [textField.text length]; 
      if (originalString.length > newLength) 
       NameText.text = [originalString substringToIndex:newLength]; 
      return YES; 
     } 
     else 
     { 
      BOOL canEdit=NO; 

      NSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"1234567890-/:;()&@\".,?!'[]{}#%^*+=_\\|~<>$£₹€•"]; 
      for (int i = 0; i < [string length]; i++) 
      { 
       unichar c = [string characterAtIndex:i]; 
       if ([myCharSet characterIsMember:c]) 
       { 
        canEdit=NO; 
       } 
       else 
       { 
        if ([NameText.text length] >= 10) 
        { 
         canEdit=NO; 
        } 
        else 
        { 
         canEdit=YES; 
        } 
       } 
      } 
      return canEdit; 
     } 
    } 
return YES; 
} 

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

+0

Вы хотите расширение UITextField действовать в качестве своего собственного делегата? Я не думаю, что вы можете это сделать, используя расширение, но вы можете подклассифицировать UITextField и напрямую обратиться к этому подклассу из IB (Редактор раскадровки). –

+0

не получаю вашу мысль, кратко. –

+0

Хорошо. Почему вы хотите сделать это в категории? Это просто повторное использование решения? Затем подкласс UITextField и в подклассе init mehtod позволяют делегату ссылаться на себя. Разумеется, ваш подкласс должен соответствовать протоколу UITextFieldDelegate. Вы не можете делать это любым способом многократного использования в расширении или в категории без дальнейших строк кода, где бы вы его повторно не использовали. –

ответ

0
@interface myLimitedTextView: UITextView <UITextViewDelegate> 

@end 

@implementation 

-(instancetype) init { // not sure from the top of my head if there are more init variancies to be overwritten. 

    self = [super init]; 
    if (self) { 
    self.delegate = self; //Do not set a delegate in IB! 
    } 
} 

// overwriting getters and setters may even be more efficient 

- (void) setDelegate { 
// You may want to NSLog here something to see, if the setter is called 
    self.delegate = self; 
} 

- (id <UITextFieldDelegate) getDelegate { 
    return self; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 
{ 
    //Do your stuff here 
    return YES; 
} 

@end 
+0

Я не могу idenify textfied == NameTextFiled в приведенном выше коде, потому что я определил textfiled в другом классе –

+0

Затем используйте 'if (textfield == self) ...'. BTW 'NameText' не является подходящим именем для переменной. Вместо этого вы должны использовать 'nameText'. Однако в приведенном выше коде просто ссылаются на 'textfield' или' self' –

Смежные вопросы