iOS. Приемы программирования. Вандад Нахавандипур
Чтение книги онлайн.

Читать онлайн книгу iOS. Приемы программирования - Вандад Нахавандипур страница 49

СКАЧАТЬ Начнем с файла реализации:

      @interface ViewController () <UITextFieldDelegate>

      @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 указывает место в текстовом поле, с которого пользователь начинает вводить текст. Итак, с помощью двух этих параметров мы создаем строку, которая сначала считывает весь текст из текстового поля, а потом использует заданный диапазон, чтобы разместить новый текст рядом со старым. Итак, получается, что вводимый нами текст будет появляться в поле после того, как СКАЧАТЬ