Чтение онлайн

ЖАНРЫ

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

• textFieldDidBeginEditing: — вызывается, когда пользователь начинает редактировать текстовое поле. Этот метод запускается уже после того, как пользователь коснулся текстового поля, а метод делегата текстового поля textFieldShouldBeginEditing: возвратил значение YES, сообщив таким образом, что пользователь может редактировать содержимое этого поля.

• textFieldShouldEndEditing: — возвращает логическое значение, сообщающее текстовому полю, закончен текущий акт редактирования или нет. Этот метод запускается перед тем, как пользователь собирается покинуть текстовое поле, или после того, как статус активного объекта (First Responder) переходит к другому полю для ввода текста. Если возвратить NO от этого метода, то пользователь не сможет перейти в другое

текстовое поле и начать вводить текст в него. Виртуальная клавиатура останется на экране.

• textFieldDidEndEditing: — вызывается, когда текущий акт редактирования конкретного текстового поля завершается. Это происходит, когда пользователь решает перейти к редактированию какого-то другого текстового поля или нажимает кнопку, предоставленную автором приложения, чтобы убрать с экрана клавиатуру, предназначенную для ввода текста в текстовое поле.

• textField: shouldChangeCharactersInRange: replacementString: — вызывается всякий раз, когда текст в текстовом поле изменяется. Возвращаемое значение этого метода — логическое. Если возвращается YES, это означает, что текст можно изменить. Если возвращается NO, то любые изменения текста в этом поле приняты не будут и даже не произойдут.

• textFieldShouldClear: — в каждом текстовом поле есть кнопка очистки — обычно это круглая кнопка с крестиком. Когда пользователь нажимает эту кнопку, все содержимое текстового поля автоматически стирается. Если вы предоставляете кнопку для очистки текста, но возвращаете от этого метода значение NO, то пользователь может подумать, что ваша программа не работает. Поэтому в данном случае вы должны отдавать себе отчет в том, что делаете. Если пользователь видит кнопку «Стереть», нажимает ее, а текст в поле не исчезает, это очень плохо характеризует программу.

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

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

@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 указывает место в текстовом поле, с которого пользователь начинает вводить текст. Итак, с помощью двух этих параметров мы создаем строку, которая сначала считывает весь текст из текстового поля, а потом использует заданный диапазон, чтобы разместить новый текст рядом со старым. Итак, получается, что вводимый нами текст будет появляться в поле после того, как метод textField: shouldChangeCharactersInRange: replacementString: возвратит YES. На рис. 1.51 показано, как приложение будет выглядеть в эмуляторе.

Поделиться с друзьями: