iOS. Приемы программирования - страница 53



• textFieldShouldReturn: – вызывается после того, как пользователь нажимает клавишу Return/Enter, пытаясь убрать клавиатуру с экрана. Текстовое поле должно быть присвоено этому методу в качестве активного элемента.

Объединим этот раздел с разделом 1.17 и создадим динамическую текстовую подпись под нашим текстовым полем. Кроме того, отобразим общее количество символов, введенных в текстовое поле. Начнем с файла реализации:


>@interface ViewController () 

>@property (nonatomic, strong) UITextField *myTextField;

>@property (nonatomic, strong) UILabel *labelCounter;

>@end


>@implementation ViewController


Теперь создадим текстовое поле с подписью и нужные нам методы делегата текстового поля. Обойдемся без реализации многих методов UITextFieldDelegate, так как в этом примере они нам не требуются:


>– (void) calculateAndDisplayTextFieldLengthWithText:(NSString *)paramText{


>NSString *characterOrCharacters = @"Characters";

>if ([paramText length] == 1){

>characterOrCharacters = @"Character";

>}


>self.labelCounter.text = [NSString stringWithFormat:@"%lu %@",

>(unsigned long)[paramText length],

>characterOrCharacters];

>}


>– (BOOL) textField:(UITextField *)textField

>shouldChangeCharactersInRange:(NSRange)range

>replacementString:(NSString *)string{


>if ([textField isEqual: self.myTextField]){

>NSString *wholeText =

>[textField.text stringByReplacingCharactersInRange: range

>withString: string];

>[self calculateAndDisplayTextFieldLengthWithText: wholeText];

>}


>return YES;


>}


>– (BOOL)textFieldShouldReturn:(UITextField *)textField{

>[textField resignFirstResponder];

>return YES;

>}


>– (void)viewDidLoad{

>[super viewDidLoad];


>CGRect textFieldFrame = CGRectMake(38.0f,

>30.0f,

>220.0f,

>31.0f);


>self.myTextField = [[UITextField alloc]

>initWithFrame: textFieldFrame];


>self.myTextField.delegate = self;


>self.myTextField.borderStyle = UITextBorderStyleRoundedRect;


>self.myTextField.contentVerticalAlignment =

>UIControlContentVerticalAlignmentCenter;


>self.myTextField.textAlignment = NSTextAlignmentCenter;


>self.myTextField.text = @"Sir Richard Branson";


>[self.view addSubview: self.myTextField];


>CGRect labelCounterFrame = self.myTextField.frame;

>labelCounterFrame.origin.y += textFieldFrame.size.height + 10;

>self.labelCounter = [[UILabel alloc] initWithFrame: labelCounterFrame];

>[self.view addSubview: self.labelCounter];


>[self calculateAndDisplayTextFieldLengthWithText: self.myTextField.text];


>}


Мы делаем важное вычисление в методе textField: shouldChangeCharactersInRange: replacementString:. Здесь мы объявляем и используем переменную wholeText. Когда вызывается этот метод, параметр replacementString указывает строку, которую пользователь ввел в текстовое поле. Вы, возможно, полагаете, что пользователь может вводить по одному символу в каждый момент времени, поэтому почему бы не присвоить данному полю значение char? Но не забывайте, что пользователь может вставить в текстовое поле целый фрагмент текста, по этой причине данный параметр должен быть строковым. Параметр shouldChangeCharactersInRange указывает место в текстовом поле, с которого пользователь начинает вводить текст. Итак, с помощью двух этих параметров мы создаем строку, которая сначала считывает весь текст из текстового поля, а потом использует заданный диапазон, чтобы разместить новый текст рядом со старым. Итак, получается, что вводимый нами текст будет появляться в поле