понедельник, 28 сентября 2015 г.

27. UITextField

Видео урок 27 находится здесь.
В этом уроке подробно рассмотрено поле ввода - UITextField.
Как и для других контролов настройки можно проводить в сторибоард.
Так же эти операции можно делать в коде

    self.firstNameField.keyboardAppearance= UIKeyboardAppearanceLight;
    self.lastNameField.keyboardAppearance=UIKeyboardAppearanceDark;

Установка  цвета всплывающей клавиатуры



    [self.firstNameField becomeFirstResponder];
установка фокуса ввода на элемент (клавиатура для ввода сразу появляется)

if ([self.lastNameField isFirstResponder]){
        [self.lastNameField resignFirstResponder];
    }
отмена фокуса ввода если он был 

Считывать и сохранять информацию с текста ввода можно по разным событиям.

- (IBAction)actionTextChange:(UITextField *)sender {
     NSLog(@"%@",sender.text);
   
}
Экшн установлен в сторибоард по изменению данных.
Для доступа к тексту используется пробреди .text


Работать с текстовые полем можно через экшн, делегаты и нотификации

Методы делегата

    self.firstNameField.delegate=self;

Установка в качестве делегата self.

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    return [textField isEqual:self.firstNameField];
}

Метод вызывается перед началом вводом. YES разрешает ввод

- (BOOL)textFieldShouldClear:(UITextField *)textField{
    
    return NO;
}

Метод используется для переопределния крестика стирания всего текста из поля ввода (здесь стирание запрещено)

- (BOOL)textFieldShouldReturn:(UITextField *)textField{
    if([textField isEqual:self.firstNameField]){
        [self.lastNameField becomeFirstResponder];
    }
    else{
        [textField resignFirstResponder];
    }
    return YES;

}

Этот метод вызывается когда нажат Return на клавиатуре
в данном случае если это поле ввода имени, при нажатии Return автоматически переходит в поле фамилии.

Нотификации

Подписываемся на нужные нотификации и тут же  отписываемся  (чтобы не забыть) в методе  dealloc  от всех нотификаций.

    NSNotificationCenter *nc=[NSNotificationCenter defaultCenter];
    [nc addObserver:self selector:@selector(notificationTextDidBeginEditing:) 
name:UITextFieldTextDidBeginEditingNotification object:nil];
}

-(void) dealloc{
    [[NSNotificationCenter defaultCenterremoveObserver:self];

}


Нотификация приходит когда начинают работать с полем ввода
    [nc addObserver:self selector:@selector(UITextFieldTextDidEndEditing:) name:UITextFieldTextDidEndEditingNotification object:nil];

В конце работы с полем
    [nc addObserver:self selector:@selector(UITextFieldTextDidChange:) name:UITextFieldTextDidChangeNotification object:nil];

в процессе ввода символов
    
    
Методы вызываемые в случае прихода нотификации:

-(void) notificationTextDidBeginEditing :(NSNotification *) notification{
    NSLog(@"notificationTextDidBeginEditing. User Info: %@",notification.userInfo);
}

-(void) UITextFieldTextDidEndEditing :(NSNotification *) notification{
    NSLog(@"UITextFieldTextDidEndEditing. User Info: %@",notification.userInfo);
}

-(void) UITextFieldTextDidChange :(NSNotification *) notification{
    NSLog(@"UITextFieldTextDidChange. User Info: %@",notification.userInfo);

}

Вот прикольное решение проблемы когда выскакивающая клавиатура закрывает TextField:
#pragma mark - keyboard

-(void)textFieldDidBeginEditing:(UITextField *)textField{
    
    [self animateTextField:textField up:YES withOffset:textField.frame.origin.y / 2];
}

-(void)textFieldDidEndEditing:(UITextField *)textField{
    
    [self animateTextField:textField up:NO withOffset:textField.frame.origin.y / 2];
    
}
-(BOOL)textFieldShouldReturn:(UITextField *)textField{
    
    [textField resignFirstResponder];
    return true;
}

-(void)animateTextField:(UITextField*)textField up:(BOOL)up withOffset:(CGFloat)offset
{
    const int movementDistance = -offset;
    const float movementDuration = 0.4f;
    int movement = (up ? movementDistance : -movementDistance);
    [UIView beginAnimations: @"animateTextField" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    [UIView commitAnimations];

}


Исходник урока 27

Домашнее задание к уроку 27:

Создаем форму для регистрации студента.

Ученик.

1. Создайте поля (и лейблы напротив как в уроке): имя, фамилия, логин, пароль, возраст, телефон, имеил адрес.
2. Установите правильные виды клавиатур для каждого текстового поля.
3. У всех текстовых полей кроме последнего кнопка ретерн должна быть NEXT, а у последнего DONE.
4. Осуществите переход по кнопкам NEXT и уберите клаву с экрана кнопкой DONE.
5. Каждое поле при нажатии должно иметь кнопку очистки

Студент

6. Совет, чтобы осуществить переход по NEXT без проверки тонны пропертей, попробуйте использовать UIOutletCollection
7. Создайте соответствующие каждому текстовому полю UILabel чтобы выводить туда информацию из текстовых полей. Сделайте их мелкими и другого цвета.
8. По изменению текста (даже буквы) обновляйте эти лейблы (не забудте про CLEAR button)

Мастер

9. Для поля ввода телефона используйте мой код из видео, можете поместить его в какой-то оотдельный метод если надо
10. Этот код должен работать только для поля телефона и не для какого другого

Супермен

11. Для поля ввода имеила ограничте ввод символов недопустимых в адресе
12. Более того, сибвол "@" может быть введен только 1 раз
13. установите разумное ограничение для этого поля

Все задания к уроку 27 выполнены

Единственный непонятный момент - даже при пустом, только что созданном проекте и текстом поле, в половине эмуляторов (айпад, айфон разных моделей) не всплывает клавиатура или клавиатура появляется без символов (клавиш в эмуляторах айпада), причем курсор в поле мигает и тест вводится с клавиатуры компьютера. Но в некоторых эмуляторах всплывающая клавиатура работает как надо. Но в процессе написания кода по непонятным причинам она перестает всплывать даже на тех эмуляторах на которых работала. Много бился с этой проблемой, но решить её не получилось.



Комментариев нет:

Отправить комментарий